@Conditional注解
它是在Spring4.0开始才有的注解。作用就是:只有满足这个条件的bean才会被创建放到容器中。
前面说活,只要在@Configuration的修饰的类中使用@Bean,那么就会bean放到容器中,有了@Conditional后,它与@Bean配合使用,让只有满组条件的bean才会放到容器中。
@Conditional怎么用?
先看源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
Class<? extends Condition>[] value();
}
首先,源码告诉我们@Conditional注解可以用在类或者方法上。
其次,使用@Conditional注解是需要给它传一个Condition类型数组。这个Condition是什么,他就是一个接口,里面是一个叫做matches的方法,这个方法就是用来些条件逻辑用的。这就说明要使用@Conditional注解时,如果不用系统自带的Conditon,我们还需要自定义一个实现Condition的类。
下面看例子:
例子1:如果是Window系统就将LiLei这个bean放到容器,如果是Linxu系统就将HanMeiMei这个bean放到容器中。
首先如果不适用@Configuration,只是用@Bean,我们用如下代码会发现2个bean都放到了容器中
@Configuration // 相当于写了一个spring的xml配置文件
public class MyConfig {
@Bean("LiLei")
public Person person1(){
return new Person("LiLei");
}
@Bean("HanMeiMei")
public Person person2(){
return new Person("HanMeiMei");
}
}
public class AppliactionRunner {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
String[] names = applicationContext.getBeanNamesForType(Person.class);
for (String name : names) {
System.out.println(name);
}
}
}
运行结果:
现在我们使用上@Configuration后,再来看一下效果,上面说过使用@Configuration时需要给他传一个实现Condition接口的类,来作为条件的逻辑,下面我们一次编写这些代码来看@Conditional的作用。
首先需要编写2个Condition接口的实现类,用来作为条件判断的逻辑(也就是判断是window系统还是LInux系统)
- WindowCondition.java
public class WindowsCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment(); String property = environment.getProperty("os.name"); if(property.contains("Windows")){ return true;// 返回true,那么bean就会放到容器中 } return false; } }
- LinuxCondition.java
public class LinuxCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment(); String property = environment.getProperty("os.name"); if(property.contains("Linux")){ return true; } return false; } }
有了Condition后,我们就可以在@Bean上使用@Conditional注解了,如下
@Configuration // 相当于写了一个spring的xml配置文件
public class MyConfig {
//如果是windows系统,就把这个bean放到容器中(其实就是看WindowsCondition中方法返回是true还是false,为true就可以把这个bean放到容器中)
@Conditional(WindowsCondition.class)
@Bean("LiLei")
public Person person1(){
return new Person("LiLei");
}
@Conditional(LinuxCondition.class)//如果是linux系统,就把这个bean放到容器中,原理同上
@Bean("HanMeiMei")
public Person person2(){
return new Person("HanMeiMei");
}
}
运行的类上面有了,这里就不写了,然后运行代码,结果如下:
可以看到只有LiLei这个bean放到了容器中,因为我的系统是Windows的。
总结:
@Conditional一般跟@Bean一起使用,使用@Conditional需要传一个Condition的参数,可以使用自带的,也可以自定义,自定义只需要编写实现Condition接口的类即可,然后把这个类当作参数放到@Conditional注解的括号中就行。