SpringBoot @Import與@Conditional注解使用詳解
說明:基于atguigu學(xué)習(xí)筆記。
在了解spring boot自動(dòng)配置原理前,再來了解下兩個(gè)注解@Import注解和@Conditional注解。
@Import
@Import注解主要用于導(dǎo)入某些特殊的Bean,這些特殊的Bean和Bean Definitaion 有關(guān)。
主要用于導(dǎo)入@Configuration 類,ImportSelector和ImportBeanDefinitionRegistrar接口的實(shí)現(xiàn)類。
@Import可以添加在@SpringBootApplication(啟動(dòng)類)、@Configuration(配置類)、@Component(組件類)對(duì)應(yīng)的類上。
一般在Spring boot 中配置都一般都是自動(dòng)導(dǎo)入的,所以我們不需要使用@Import,但是如果你你想導(dǎo)入的配置類不在自動(dòng)掃包路徑,那么該配置類就需要使用@Import導(dǎo)入,尤其是第三方j(luò)ar包的配置類都需要借助@Import來導(dǎo)入。
這里我們首先熟悉基本語法,具體的用法后面再學(xué)。
示例:
還使用上一章里項(xiàng)目示例:@Configuration注解和@Bean注解
使用 @Import導(dǎo)入我們需要的類,這里導(dǎo)入我們自己創(chuàng)建的類和第三方logback jar包里的類,如下:
config類:
package com.example.ethan.config; import ch.qos.logback.core.db.DBHelper; import com.example.ethan.bean.Dept; import com.example.ethan.bean.User; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Import({User.class, DBHelper.class}) @Configuration(proxyBeanMethods=true) public class ConfigDemo { @Bean public User user01(){ User zhangsan = new User("zhangsan", 18); //user組件依賴了Dept組件 zhangsan.setDept(rd()); return zhangsan; } @Bean("my rd") public Dept rd(){ return new Dept("研發(fā)部"); } }
主程序
package com.example.ethan; import ch.qos.logback.core.db.DBHelper; import com.example.ethan.bean.Dept; import com.example.ethan.bean.User; import com.example.ethan.config.ConfigDemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class EthanApplication { public static void main(String[] args) { // 返回ioc容器 ConfigurableApplicationContext run = SpringApplication.run(EthanApplication.class, args); // 只查看User類型的Bean String[] beanDefinitionNames = run.getBeanNamesForType(User.class); System.out.println("========================"); for (String name : beanDefinitionNames) { System.out.println(name); } DBHelper bean = run.getBean(DBHelper.class); System.out.println(bean); // com.example.ethan.bean.User //user01 //ch.qos.logback.core.db.DBHelper@67207d8a } }
可以看到,使用 @Import注解,會(huì)給容器中自動(dòng)創(chuàng)建出這兩個(gè)類型的Bean,且Bean的名字是全類名。
@Conditional
滿足Conditional指定的條件,則進(jìn)行注入指定Bean。
@Conditional是一個(gè)根注解,下面還派生了許多其他注解
@Conditional注解可以加在方法上也可以加在類上。當(dāng)加在類上,當(dāng)條件不成立,類中所有代碼都不執(zhí)行,如果加在方法上,則只這個(gè)方法不執(zhí)行。
下面以@ConditionalOnBean(條件是判斷是否含有某個(gè)Bean)為例,演示代碼如下:
首先放在方法上:
package com.example.ethan.config; import com.example.ethan.bean.Dept; import com.example.ethan.bean.User; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods=true) public class ConfigDemo { @Bean("my rd") public Dept rd(){ return new Dept("研發(fā)部"); } @Bean @ConditionalOnBean(name = "my rd") public User user01(){ User zhangsan = new User("zhangsan", 18); //user組件依賴了Dept組件 zhangsan.setDept(rd()); return zhangsan; } }
主程序:
package com.example.ethan; import ch.qos.logback.core.db.DBHelper; import com.example.ethan.bean.Dept; import com.example.ethan.bean.User; import com.example.ethan.config.ConfigDemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class EthanApplication { public static void main(String[] args) { // 返回ioc容器 ConfigurableApplicationContext run = SpringApplication.run(EthanApplication.class, args); boolean my_rd = run.containsBean("my rd"); System.out.println("容器中含有my rd這個(gè)Bean:" + my_rd); boolean user01 = run.containsBean("user01"); System.out.println("容器中含有user01這個(gè)Bean:" + user01); } }
這時(shí)候兩個(gè)好結(jié)果都是true,因?yàn)榘凑枕樞蜃⑷隑ean時(shí),先注入了"my rd"這個(gè)Bean到容器,然后在注入user01時(shí),檢查容器中含有my rd"這個(gè)Bean,就把user01也注入了。
如果把條件里name改為不存在的如"my rd02",那么入user01就不會(huì)注入容器。
下面把注解放到類上:
package com.example.ethan.config; import com.example.ethan.bean.Dept; import com.example.ethan.bean.User; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods=true) @ConditionalOnBean(name = "my rd") public class ConfigDemo { @Bean("my rd") public Dept rd(){ return new Dept("研發(fā)部"); } @Bean public User user01(){ User zhangsan = new User("zhangsan", 18); //user組件依賴了Dept組件 zhangsan.setDept(rd()); return zhangsan; } }
這時(shí)候兩個(gè)Bean都不會(huì)注入容器,因?yàn)樵趫?zhí)行這個(gè)類時(shí)檢查條件不成立。
這里對(duì)@ConditionalOnBean有個(gè)初步了解,具體何種用法類似,可舉一反三。
參考:
到此這篇關(guān)于SpringBoot @Import與@Conditional注解使用詳解的文章就介紹到這了,更多相關(guān)SpringBoot @Import與@Conditional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解springboot如何更新json串里面的內(nèi)容
這篇文章主要為大家介紹了springboot 如何更新json串里面的內(nèi)容,文中有詳細(xì)的解決方案供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-10-10IDEA使用Tomcat運(yùn)行web項(xiàng)目教程分享
在非Spring Boot項(xiàng)目中運(yùn)行Nacos示例,需要手動(dòng)配置Tomcat容器,本文介紹了如何在IDEA中配置Tomcat,并詳細(xì)解決了配置過程中可能遇到的異常情況,步驟包括修改IDEA項(xiàng)目結(jié)構(gòu)、添加Web模塊、配置Artifacts和Tomcat Server2024-10-10SpringCloud聲明式Feign客戶端調(diào)用工具使用
這篇文章主要為大家介紹了SpringCloud聲明式Feign客戶端調(diào)用工具使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Java中MapStruct映射處理器報(bào)錯(cuò)的問題解決
MapStruct是一個(gè)強(qiáng)大的Java映射框架,它能夠在編譯時(shí)生成映射代碼,,本文主要介紹了Java中MapStruct映射處理器報(bào)錯(cuò)的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03controller函數(shù)中參數(shù)列表使用多個(gè)@RequestBody問題
這篇文章主要介紹了controller函數(shù)中參數(shù)列表使用多個(gè)@RequestBody問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04springboot單元測(cè)試兩種方法實(shí)例詳解
這篇文章主要介紹了springboot單元測(cè)試兩種方法實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12