今天主要從以下幾方面來介紹一下@Conditional註解
@Conditional註解是什麼
@Conditional註解怎麼使用
1,@Conditional註解是什麼
@Conditional註解是可以根據一些自定義的條件動態的選擇是否加載該bean到springIOC容器中去,如果看過springBoot源碼的同學會發現,springBoot中大量使用了該註解
2,@Conditional註解怎麼使用
查看@Conditional源碼你會發現它既可以作用在方法上,同時也可以作用在類上,源碼如下:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
/**
* All {@link Condition}s that must {@linkplain Condition#matches match}
* in order for the component to be registered.
*/
Class<? extends Condition>[] value();
}
a,@Conditional作用在方法上
定義一個Condition如下:
/**
* 定義一個bean的Condition
*
* @author zhangqh
* @date 2018年5月1日
*/
public class MyCondition implements Condition {
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
String system = env.getProperty("os.name");
System.out.println("系統環境爲 ==="+system);
// 系統環境在Windows才加載該bean到容器中
if(system.contains("Windows")){
return true;
}
return false;
}
}
定義一個bean加上@Conditional註解如下:
@Conditional({MyCondition.class})
@Bean(value="user1")
public User getUser1(){
System.out.println("創建user1實例");
return new User("李四",26);
}
測試如下:
AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
String[] beanNames = applicationContext2.getBeanDefinitionNames();
for(int i=0;i<beanNames.length;i++){
System.out.println("bean名稱爲==="+beanNames[i]);
}
運行結果:
bean名稱爲===mainConfig
bean名稱爲===user0
bean名稱爲===user1
我這邊電腦系統是window所以user1實例是有創建出來的,如果把MyCondition中的判斷改成if(system.contains("linux"))那麼user1是不會加載到spring容器中的
b,@Conditional作用在類上
修改註解配置如下:
/**
* 定義一個註解配置文件 必須要加上@Configuration註解
*
* @author zhangqh
* @date 2018年4月30日
*/
@Conditional({MyCondition.class})
@Configuration
public class MainConfig {
/**
* 定義一個bean對象
* @return
*/
@Scope
@Lazy
@Bean(value="user0")
public User getUser(){
System.out.println("創建user實例");
return new User("張三",26);
}
//@Conditional({MyCondition.class})
@Bean(value="user1")
public User getUser1(){
System.out.println("創建user1實例");
return new User("李四",26);
}
}
運行測試:
bean名稱爲===mainConfig
bean名稱爲===user0
bean名稱爲===user1
MainConfig中的bean都成功打印出來了,因爲我MyCondition條件返回的是true,同樣如果我修改成if(system.contains("linux"))那麼MainConfig的bean就都不會實例化了
以上是今天文章的所有內容,歡迎大家吐槽
更多優質文章請關注以下公衆號查閱: