3.4 Spring高级话题: 条件注解@Conditional
3.4 Spring 条件注解
1.Sprin4g提供了更通用的基于条件的Bean的创建->@Conditional
2.@Conditional根据满足一个特定的条件去创建一个Bean
-> 2.1 比如当一个jar在一个类路径的情况下
-> 2.2 只有在某个Bean被创建的情况下才会创建Bean
配置过程
1.继承org.springframework.context.annotation.Condition实现matches接口
-> 去判断是否满足条件
2.在@Bean后加上@Conditional(参数为自定义的Condition)决定是否实例化Bean
3.获取容器时候会自动注入
1.java配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@Configuration
@ComponentScan("com.sgx.inspect.bug.condition")
public class ConditionConfigure {
@Bean
@Conditional(MyMacCondition.class)
public List getMacBean() {
System.out.println("初始化MacBean");
List list = new ArrayList();
list.add("mac");
return list;
}
@Bean
@Conditional(MyWinCondition.class)
public List getWinBean() {
System.out.println("初始化WinBean");
List list = new LinkedList();
list.add("mac");
return list;
}
}
2.自定义条件
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class MyMacCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return conditionContext.getEnvironment().getProperty("os.name").contains("Mac OS X");
}
}
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class MyWinCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return conditionContext.getEnvironment().getProperty("os.name").contains("win");
}
}
3.测试使用
import com.sgx.inspect.bug.condition.ConditionConfigure;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.List;
public class Main3 {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfigure.class);
List bean = context.getBean(List.class);
System.out.println("bean:" + bean.get(0));
}
}
4.mac下输出
初始化MacBean
bean:mac