@Conditional注解通常配合@Bean和@Configuration使用,在配置时用于判断spring容器是否注入某个实体类。
@Conditional的定义:
从代码中可以看到此注解需要传入class类型的数组,并且这些class都继承Condition类
点开Condition源码,可以看到:
Condition接口中定义了一个返回值为布尔值的抽象方法,因此可以联想到 @Conditional注解就是根据这个返回的布尔值判断是否将当前类注入spring容器的。
了解完原理,我们来实践一下
1、首先创建一个实体类
package com.shijinyi.demo.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* @author : S JY
* @description :
* @date : 2019/11/21 9:36
*/
@Setter
@Getter
@ToString
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
}
2、将实体类注入spring容器(先不加@Conditional判断)
@Configuration
public class BeanConfig {
@Bean(name = "Klose")
// @Conditional(WindowsCondition.class)
public Person person1(){
return new Person("Klose",25);
}
@Bean(name = "Jay")
// @Conditional(LinuxCondition.class)
public Person person2(){
return new Person("Jay",24);
}
}
3、Junit测试下是否注入成功
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
@Test
public void test1() {
Map<String, Person> map = applicationContext.getBeansOfType(Person.class);
System.out.println(map);
}
}
成功注入:
4、编写两个不同的Condition接口实现类 并测试@Conditional注解测试
public class Condition1 implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//todo 写一些逻辑代码
//context.getEnvironment().getProperty("swagger.enable", Boolean.class, false);
//StringUtil.isNotEmpty(context.getEnvironment().getProperty("spring.datasource.url"));
return true;
}
}
public class Condition2 implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//todo 写一些逻辑代码
return false;
}
}
@Configuration
public class BeanConfig {
@Bean(name = "Klose")
@Conditional(Condition1.class)
public Person person1(){
return new Person("Klose",25);
}
@Bean(name = "Jay")
@Conditional(Condition2.class)
public Person person2(){
return new Person("Jay",24);
}
}
测试结果:
经过代码实践,也了解了@Conditional注解的用法。
多个condition
@Configuration
public class BeanConfig {
@Bean(name = "Klose")
@Conditional({Condition1.class,Condition2.class})
public Person person1(){
return new Person("Klose",25);
}
@Bean(name = "Jay")
@Conditional(Condition2.class)
public Person person2(){
return new Person("Jay",24);
}
}