問題描述
項目中採用了maven 分佈式的模塊開發。其中baseFrame 模塊依賴common模塊。
在common中配置了一些公共的基礎類。如工具類,統一異常處理,AOP日誌輸出,filter等等。
然而在使用中,發現其中的一些輔助類並沒有生效。
原因分析
spring 在初始化時,默認是掃描啓動類所在目錄,將所有帶註解的java類進行統一管理。由於common模塊並不在啓動類的所在目錄,所以其中的bean是沒有被初始化的。這時候就需要我們制定需要掃描的目錄,其只要實現依靠@ComponentScan註解。
解決方案
在啓動類上通過@ComponentScan註解引入其他模塊的目錄。
@SpringBootApplication
@MapperScan("jaylen.stocks.dao")
@ComponentScan(basePackages={"cn.jaylen.common"})
public class BaseFrameApplication {
public static void main(String[] args) {
SpringApplication.run(BaseFrameApplication.class, args);
}
}
引入過後,確實能加載到common下面的所有bean。
但是@ComponentScan()註解會覆蓋spring默認的掃描機制,即不會在掃描啓動類所在的目錄。所以我們不僅要引入common包路徑,啓動類所在路徑也同樣需要引入。
@SpringBootApplication
@MapperScan("jaylen.stocks.dao")
@ComponentScan(basePackages={"cn.jaylen.common","jaylen.stocks"})
public class BaseFrameApplication {
public static void main(String[] args) {
SpringApplication.run(BaseFrameApplication.class, args);
}
/**
* *
* 解決跨域問題
* * @return
* @return
*/
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config); // CORS 配置對所有接口都有效
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
}
這樣就大工告成了。
本博客主要爲日常問題記錄,在解決問題時,主要參見pringboot 多模塊注入bean ,訪問不到