Spring及Spring Boot注入依賴的Bean
阿新 • • 發佈:2018-11-23
2018-10-23 某模型平臺需要注入子模組的Bean
文章目錄
前言
模組化的Spring或Spring Boot工程,當遇到某個模組是基礎工具模組或者模組間程式碼依賴較複雜的情況,其它模組就需要注入所依賴模組的Bean。
Spring匯入依賴的Bean
假設第三jar包中採用的是XML配置檔案(third-party-appContext.xml),則可直接使用如下方法匯入依賴的Bean:
<import resource="classpath:third-party-appContext.xml"/>
為保證jar包的配置檔案能被正確獲取,在third-party-appContext.xml中配置好PropertyPlaceholderConfigurer
Spring Boot匯入依賴的Bean
Spring Boot與Spring在這個問題上的最大的區別是:Spring Boot對配置檔案命名是有約束的,預設情況下它只會讀取特定目錄下名為application.properties
的配置檔案1。而Spring Boot本身會自動生成一個PropertyPlaceholderConfigurer
的Bean去獲取application.properties
,所以如果在XML中配置該Bean是不會生效的。
方法一:定義配置類覆蓋PropertyPlaceholderConfigurer
@Configuration
public class PropertyConfigurer {
@Bean
public static PropertyPlaceholderConfigurer properties() {
final PropertyPlaceholderConfigurer conf = new PropertyPlaceholderConfigurer();
final List<Resource> resources = new ArrayList<>();
resources.add(new ClassPathResource("third-party-application.properties"));
conf.setLocations(resources.toArray(new Resource[]{}));
return conf;
}
}
方法二:定義PropertyPlaceholderConfigurer
的Bean
@Bean
public class PropertyConfigurer extends PropertyPlaceholderConfigurer {
public PropertyConfigurer() {
this.setIgnoreResourceNotFound(true);
final List<Resource> resources = new ArrayList<>();
resources.add(new ClassPathResource("third-party-application.properties"));
this.setLocations(resources.toArray(new Resource[]{}));
}
}
方法三:使用@ConfigurationProperties
詳見Spring Boot文件
方法四:命令列執行時使用spring.config.location
環境屬性指定特定的properties檔案
詳見Spring Boot文件中Externalized Configuration相關內容
潛在的坑
- Jar包依賴沒有新增到Pom,或者沒有mvn install到本地環境
<context:property-placeholder/>
和PropertyPlaceholderConfigurer的衝突問題- 始終無法獲取properties檔案的配置,請閱讀參考閱讀#2連結
參考閱讀
- https://stackoverflow.com/questions/5092133/divide-spring-configuration-across-multiple-projects
- https://www.baeldung.com/properties-with-spring
- https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html