根据特定条件来创建Bean。
通过实现condition接口,并重写matches方法来构造判断条件。
条件类:
Windows条件:
public class WindowsCondition implements Condition{
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String property = context.getEnvironment().getProperty("os.name");
boolean contains = property.contains("Windows");
return contains;
}
}
实现Condition接口,重写matches方法,在方法中自定义判断条件。
此处判断的条件为,当前系统为Windows系统。
Linux条件:
public class LinuxCondition implements Condition{
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String property = context.getEnvironment().getProperty("os.name");
boolean contains = property.contains("Linux");
return contains;
}
}
此处判断的条件为,当前系统为Linux系统。
让以上两个不同类实现接口,重写相同的方法,便于测试运行。
public interface ListService {
public String showListCmd();//打印输出列表命令
}
Windows下的输出列表命令:
public class WindowsListServiceImpl implements ListService{
public String showListCmd() {
return "dir";
}
}
Linux下的输出列表命令:
public class LinuxListServiceImpl implements ListService{
public String showListCmd() {
return "ls";
}
}
配置类:
@Configuration
public class ConditionConfig {
@Bean
@Conditional(WindowsCondition.class)
public ListService widonwsService() {
return new WindowsListServiceImpl();
}
@Bean
@Conditional(LinuxCondition.class)
public ListService linuxService() {
return new LinuxListServiceImpl();
}
}
@Conditional(WindowsCondition.class):在方法上设定条件,当WindowsCondition中的条件满足时,才会执行当前方法。
@Conditional(LinuxCondition.class):意思与上一致,当@Conditional注解中的条件类满足时,才执行当前方法。
测试运行:
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext
(ConditionConfig.class);
ListService bean = context.getBean(ListService.class);
System.out.println(context.getEnvironment().getProperty("os.name")+"系统下的列表命令为:"+bean.showListCmd());
context.close();
}
}