条件注解@Conditional
再Spring中基本所有的延申类条件注解都是基于@Conditional进行拓展的,通过此注解能够限制配置类或者某个指定的@Bean是否生效(是否需要注入)
注解定义在类上(一般指定Configuration配置类),用于判断该类是否生效
和@Bean配合使用时,用于判断该bean是否需要注入
一、Condition接口
@Conditional注解的属性是一个Condition接口实现类的Class数组,每一个Condition实现类都相当于一个条件,只有当全部条件为true,才会生效或是注入。
其中Condition接口实现类需要实现matchs方法,条件满足返回true,否则返回false
二、示例
创建接口和对应实现类,显示当前系统用于测试
public interface SysService {
void show();
}
public class LinuxService implements SysService {
@Override
public void show() {
System.out.println("我是linux");
}
}
public class WindowsService implements SysService {
@Override
public void show() {
System.out.println("我是Window");
}
}
创建Condition实现类,在match方法中约定条件判断规则,此类中将条件为真判定为系统名字包含“Linux”
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String sysName = context.getEnvironment().getProperty("os.name");
if (sysName.contains("Linux")) {
return true;
}
return false;
}
}
创建Condition实现类,在match方法中约定条件判断规则,此类中将条件为真判定为系统名字包含“Windows”
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext context,
AnnotatedTypeMetadata metadata) {
String sysName = context.getEnvironment().getProperty("os.name");
if (sysName.contains("Windows")) {
return true;
}
return false;
}
}
将@Bean和@Conditional组合使用,实现Bean注入,本次测试环境为Windows系统,因此只有WindowsService的Bean注入成功。
@Configuration
public class ConditionConfig {
@Bean
@Conditional(WindowsCondition.class) // 1如果是wind系统创建对应的bean
public SysService windowsListService() {
return new WindowsService();
}
@Bean
@Conditional(LinuxCondition.class) // 2如果是Linux系统创建对应的bean
public SysService linuxListService() {
return new LinuxService();
}
}
通过测试类,查看注入成功的Bean
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionConfig.class);
SysService sysService = context.getBean(SysService.class);
String sysName = context.getEnvironment().getProperty("os.name");
System.out.println("当前的操作系统是:"+sysName);
System.out.println("------------------------------------");
sysService.show();
}
}
测试结果如下: