@Conditional是Spring4新提供的註解,它的作用是按照一定的條件進行判斷,滿足條件給容器註冊bean。
直接上代碼看效果
實例1,在沒有設置@Conditional時
配置類
@Configuration
@ComponentScan("com.lquan.condition")
public class ConditionConfig {
//@Conditional({MacCondition.class})
@Bean("Mac")
public User userM(){
return new User("Mac","系統是Mac可以這冊到容器");
}
//@Conditional({LinuxCondition.class})
@Bean("linux")
public User userL(){
return new User("linux","系統是Mac可以註冊到容器");
}
@Bean("windows")
public User userw(){
return new User("windows","windows沒有約束");
}
}
User類
public class User {
private String name;
private String desc;
public User(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
測試類
public class TestMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ConditionConfig.class);
Map<String,User> map = ac.getBeansOfType(User.class);
System.out.println(map);
}
}
測試結果:
實例2,在設置@Conditional時
使用@Conditional時首先要實現對應的Condition接口
public class MacCondition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String name = context.getEnvironment().getProperty("os.name");
if(name.contains("Mac")){
return true;
}
return false;
}
}
public class LinuxCondition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String name = context.getEnvironment().getProperty("os.name");
if(name.contains("linux")){
return true;
}
return false;
}
}
修改配置類
@Configuration
@ComponentScan("com.lquan.condition")
public class ConditionConfig {
@Conditional({MacCondition.class})
@Bean("Mac")
public User userM(){
return new User("Mac","系統是Mac可以這冊到容器");
}
@Conditional({LinuxCondition.class})
@Bean("linux")
public User userL(){
return new User("linux","系統是Mac可以註冊到容器");
}
@Bean("windows")
public User userw(){
return new User("windows","windows沒有約束");
}
}
測試結果:
結論:@Conditional註解就是一個條件判斷,只要實現的Condition接口返回的結果是true,那麼對應的註解就會生效,
本例子是利用操作系統來判斷是注入User到容器中的,我當前的運行環境是Mac ,所以會注入對應的User