SpringBoot深入探究@Conditional條件裝配的使用
1.相關(guān)介紹
@Conditional注解可以用在任何類型或者方法上面,通過@Conditional注解可以配置一些條件判斷,當(dāng)所有條件都滿足的時候,被@Conditional標(biāo)注的目標(biāo)才會被spring容器處理。
比如可以通過@Conditional來控制bean是否需要注冊,控制被@Configuration標(biāo)注的配置類是需要需要被解析等。
Conditional相關(guān)的其它注解:
注解 | 描述 |
---|---|
@ConditionalOnBean | 在某個 bean 存在的時候 |
@ConditionalOnMissingBean | 在某個 bean 不存在的時候 |
@ConditionalOnClass | 當(dāng)前 classPath 下可以找到某個 class 的時候 |
@ConditionalOnMissingClass | 當(dāng)前 classPath 下無法找到某個 class 的時候 |
@ConditionalOnResource | 當(dāng)前 classPath 下否存在某個資源文件的時候 |
@ConditionalOnProperty | 當(dāng)前 JVM 包含某個屬性值的時候 |
@ConditionalOnWebApplication | 當(dāng)前 Spring context 是 web 應(yīng)用程序的時候 |
@ConditionalOnJava | 在指定JDK版本的時候 |
@ConditionalOnExpression | 符合表達(dá)式的時候 |
@ConditionalOnJndi | JNDI存在該項的時候 |
2.舉例測試
@ConditionalOnBean, 在某個 bean 存在的時候被標(biāo)注的組件才被注冊到IOC容器中
下面是其詳細(xì)代碼
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Conditional({OnBeanCondition.class}) public @interface ConditionalOnBean { Class<?>[] value() default {}; String[] type() default {}; Class<? extends Annotation>[] annotation() default {}; String[] name() default {}; SearchStrategy search() default SearchStrategy.ALL; Class<?>[] parameterizedContainer() default {}; }
我們就拿它來測試一下
1.指定組件不存在時
MyConfig
package com.limi.config; import com.limi.entity.User; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.*; @Configuration public class MyConfig { // @Bean // public User user01(){ // return new User(1, "andy", "123456"); // } @Bean @ConditionalOnBean(name = "user01") //當(dāng)user01存在時才注冊user02 public User user02(){ return new User(2, "bob", "666666"); } }
MainApplication
package com.limi; import com.limi.entity.User; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class MainApplication { public static void main(String[] args) { //1、返回我們IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); if(run.containsBean("user01")) System.out.println((User)run.getBean("user01")); System.out.println("user01 不存在!\n"); if(run.containsBean("user02")) System.out.println((User)run.getBean("user02")); else System.out.println("user02 不存在!\n"); } }
運行結(jié)果
2.指定組件存在時
MyConfig
package com.limi.config; import com.limi.entity.User; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.*; @Configuration public class MyConfig { @Bean public User user01(){ return new User(1, "andy", "123456"); @Bean @ConditionalOnBean(name = "user01") //當(dāng)user01存在時才注冊user02 public User user02(){ return new User(2, "bob", "666666"); } }
MainApplication
package com.limi; import com.limi.entity.User; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class MainApplication { public static void main(String[] args) { //1、返回我們IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); if(run.containsBean("user01")) System.out.println((User)run.getBean("user01")); else System.out.println("user01 不存在!\n"); if(run.containsBean("user02")) System.out.println((User)run.getBean("user02")); else System.out.println("user02 不存在!\n"); } }
運行結(jié)果
3.完整代碼
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.limi</groupId> <artifactId>springboot-test1</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!--打包插件, 使用它可以把項目打包為jar包--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
User
package com.limi.entity; public class User { private Integer id; private String userName; private String passWord; public User(){} public User(Integer id, String userName, String passWord) { this.id = id; this.userName = userName; this.passWord = passWord; } @Override public String toString() { return "User{" + "id=" + id + ", userName='" + userName + '\'' + ", passWord='" + passWord + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } }
MyConfig
package com.limi.config; import com.limi.entity.User; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.*; @Configuration public class MyConfig { @Bean public User user01(){ return new User(1, "andy", "123456"); } @Bean @ConditionalOnBean(name = "user01") //當(dāng)user01存在時才注冊user02 public User user02(){ return new User(2, "bob", "666666"); } }
MainApplication
package com.limi; import com.limi.entity.User; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class MainApplication { public static void main(String[] args) { //1、返回我們IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); if(run.containsBean("user01")) System.out.println((User)run.getBean("user01")); else System.out.println("user01 不存在!\n"); if(run.containsBean("user02")) System.out.println((User)run.getBean("user02")); else System.out.println("user02 不存在!\n"); } }
到此這篇關(guān)于SpringBoot深入探究@Conditional條件裝配的使用的文章就介紹到這了,更多相關(guān)SpringBoot @Conditional內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java語言描述存儲結(jié)構(gòu)與鄰接矩陣代碼示例
這篇文章主要介紹了Java語言描述存儲結(jié)構(gòu)與鄰接矩陣代碼示例,涉及Java存儲結(jié)構(gòu),鄰接矩陣,鄰接表的介紹與比較,然后分享了鄰接矩陣的Java實現(xiàn)等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考。2017-11-11關(guān)于Spring Bean實例過程中使用反射和遞歸處理的Bean屬性填充問題
本文帶領(lǐng)大家一起學(xué)習(xí)下在Spring Bean實例過程中如何使用反射和遞歸處理的Bean屬性填充,需要在類 AbstractAutowireCapableBeanFactory 的 createBean 方法中添加補(bǔ)全屬性方法,具體操作方法跟隨小編一起學(xué)習(xí)下吧2021-06-06Java TCP網(wǎng)絡(luò)通信協(xié)議詳細(xì)講解
TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission?Control?Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層2022-09-09MyBatis學(xué)習(xí)教程之開發(fā)Dao的方法教程
這篇文章主要給大家介紹了關(guān)于MyBatis開發(fā)Dao的相關(guān)資料,使用Mybatis開發(fā)Dao,通常有兩個方法,即原始Dao開發(fā)方法和Mapper接口開發(fā)方法。文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面來一起看看吧。2017-07-07