本篇介紹下,如何經過springboot的條件配置,控制Bean的建立html
不少時候,咱們在公司用springboot做爲基礎框架開發項目的時候,會碰見建立BeanB的時候,須要BeanA已經建立好了,也就是根據條件來判斷,是否建立該BeanB,這邊寫個教程,給各位做參考java
此次,咱們只在同一個項目內的 @Configuration 配合 @Bean 作演示,實際狀況下,比較推薦用類註解 @Component 配合條件註解使用,下面演示的,只是比較經常使用的一些條件配置註解,並不包含全部git
咱們先建立一個普通的spring-boot項目,記得添加web依賴,不然,項目不會後臺運行web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
建立一個測試條件配置的類(不跟啓動類一個目錄下,最好單首創建一個目錄)spring
@Configuration public class SpecialBeanFactory { @Bean public A buildA(){ return new A(); } @Bean // 若是存在Bean A,則建立Bean B @ConditionalOnBean(A.class) public B buildB(){ return new B(); } @Bean // 目錄下猶如包含E.class 則建立Bean C @ConditionalOnClass(E.class) public C buildC(){ return new C(); } @Bean @ConditionalOnMissingClass(value = "W") public D buildD(){ return new D(); } @Bean // 若是不存在Bean E 那麼建立Bean F @ConditionalOnMissingBean(E.class) public F buildF(){ return new F(); } @Bean // 屬性文件若是存在 key=hexiaowu value= nan 的則建立BeanH @ConditionalOnProperty(value = "hexiaowu",havingValue = "nan") public H buildH(){ return new H(); } }
而後咱們在啓動下啓動類,會看到以下日誌springboot
2018-10-18 20:08:49.732 INFO 24960 --- [ main] com.example.conditionBase.vo.A : 建立 A 2018-10-18 20:08:49.733 INFO 24960 --- [ main] com.example.conditionBase.vo.B : 建立 B 2018-10-18 20:08:49.734 INFO 24960 --- [ main] com.example.conditionBase.vo.C : 建立 C 2018-10-18 20:08:49.735 INFO 24960 --- [ main] com.example.conditionBase.vo.D : 建立 D 2018-10-18 20:08:49.736 INFO 24960 --- [ main] com.example.conditionBase.vo.F : 建立 F
打印上面日誌,說明條件配置生效了框架
使用條件配置,咱們須要配置的東西不多,也就新增條件配置註解ide
條件配置官方文檔地址以下: 條件配置官方文檔spring-boot
註解 | 使用 |
---|---|
@ConditionalOnBean | 若是註解內的Bean存在,那麼則建立註解類或者方法返回的Bean |
@ConditionalOnClass | 若是註解內classpath下存在某個class,那麼建立註解類或者方法返回的Bean |
@ConditionalOnMissingClass | 若是註解內classpath沒有該class名稱,那麼建立註解類或者方法返回的Bean |
@ConditionalOnMissingBean | 若是註解內的Bean不存在,那麼建立註解類或者方法返回的Bean |
@ConditionalOnProperty | 若是屬性文件內,包含註解內對應的屬性名稱跟值,那麼建立註解類或者方法返回的Bean |
注意: 在配合 @Bean
註解跟條件註解使用建立Bean的時候,須要注意的是, @Bean
註解是跟@Configuration
註解配合外部配置的,也就是跟 @ComponentScan
掃描有不一樣的區別,掃描會有依賴(生成一個有向圖的依賴,我的猜想,沒具體研究過源碼),可是 @Bean
卻沒有, 例如: 在配置註解 @Configuration
類下 建立B Bean,須要A Bean不存在,若是建立B Bean的方法在建立A Bean前面,那麼B跟A都會建立,若是建立A在建立B前面,那邊B則不會建立,須要注意,若是是經過掃描的,則不用擔憂這點,工具
本次介紹的,只是比較經常使用的,並無介紹全,例如: 自定義條件配置,以及資源條件配置等,並未介紹,下篇介紹
項目源碼,我已經上傳到gitee
須要的朋友,能夠本身點擊查看 springboot條件配置
到這,文章就結束了!
以上,均爲本人測試而得出的結果,可能會有出入,或者錯誤,歡迎指正
歡迎轉載,請註明出處跟做者,謝謝!