能够根据不一样的条件来作出不一样的事情。在Spring中条件注解能够说是设计模式中状态模式的一种体现方式,同时也是面向对象编程中多态的应用部分。 在Spring框架中,当咱们使用条件注解时,咱们会为每种独立的条件建立一个类,根据这个类对应的条件的成立状况咱们来选择不一样的任务来执行。固然咱们在声明任务时,通常使用接口来声明。由于咱们会在Spring的配置类中指定具体条件下的具体类。接下来,咱们未来看一下Spring框架中@Conditional
注解的具体使用方式。java
@Configuration public class MainConfig2 { /** * @Conditional({Condition}) : 按照必定的条件进行判断,知足条件给容器中注册bean * * 若是系统是windows,给容器中注册("bill") * 若是是linux系统,给容器中注册("linus") */ @Conditional(WindowsCondition.class) @Bean("bill") public Person person01(){ return new Person("Bill Gates",62); } @Conditional(LinuxCondition.class) @Bean("linus") public Person person02(){ return new Person("linus", 48); } }
须要建立@Conditional注解所需的条件类。每一个条件类对应着一种独立的状况,在Spring中的条件类须要实现Condition接口.linux
//判断是否linux系统 public class LinuxCondition implements Condition { /** * ConditionContext:判断条件能使用的上下文(环境) * AnnotatedTypeMetadata:注释信息 */ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //一、能获取到ioc使用的beanfactory ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); //二、获取类加载器 ClassLoader classLoader = context.getClassLoader(); //三、获取当前环境信息 Environment environment = context.getEnvironment(); //四、获取到bean定义的注册类 BeanDefinitionRegistry registry = context.getRegistry(); String property = environment.getProperty("os.name"); //能够判断容器中的bean注册状况,也能够给容器中注册bean boolean definition = registry.containsBeanDefinition("person"); if(property.contains("linux")){ return true; } return false; } }
//判断是否windows系统 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; } return false; } }