有幸參與了公司新框架的開發,大佬們齊思廣義,我很尷尬,啥都不會。老大問我有什麼想法,我想最好的想法就是學習大佬們的想法吧。
META-INF/spring.factories文件
如何讓我們的starter裏的@Configuration在使用者的項目裏生效呢?
在SpringBoot的啓動類中,@SpringBootApplication註解的代碼裏面有一句@EnableAutoConfiguration
@ComponentScan註解的作用是掃描@SpringBootApplication所在的Application類(即spring-boot項目的入口類)所在的包(basepackage)下所有的@component註解(或拓展了@component的註解)標記的bean,並註冊到spring容器中。
@EnableAutoConfiguration註解加載的是資源目錄META-INF文件下的spring.factories的文件。包括導入到項目中的Jar包的META-INF文件夾下的spring.factories文件。spring.factories文件是一個properties文件。
我的spring.factories文件的內容如下。也就是說,其它項目在導入我的這個Jar的時候,會去加載MyConfig與MyConfig2這兩個類。多個類用逗號隔開。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
cn.tyzhou.config.MyConfig,cn.tyzhou.config.MyConfig2
下方就是MyConfig2的代碼。
ConditionalOnClass與ConditionalOnMissingBean
@ConditionalOnClass(Gson.class)表示如果編譯路徑下沒有Gson.class依賴,那麼就不會加載這個Bean。但是實際情況是你既然能夠編譯打包成功,一定會有這個文件,除非手動在target文件下刪除了這個class字節碼文件。
@ConditionalOnMissingBean表示,如果消費者項目(使用我們Jar包的項目)沒有配置Gson這個類,那麼就會爲容器創建一個Gson對象。如果 消費者項目 自己創建了一個配置類,初始化了一個Gson Bean對象,那麼下面的使用@ConditionalMissingBean的方法就不會執行。
@Configuration
@ConditionalOnClass(Gson.class)
public class MyConfig2 {
@Bean
@ConditionalOnMissingBean
public Gson gson() {
return new Gson();
}
}