接着上篇内容:spring注解开发(一、组件注册),这里主要讲讲@Conditional注解,顾名思义,就是根据条件进行组件注册。这个在springboot中也是使用较多的一个注解。
1.新增或修改如下类
(1)新增WindowsConditon,实现Conditon接口
package com.qxf.condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @Auther: qiuxinfa
* @Date: 2019/12/15
* @Description: 判断当前操作系统是否为windows
*/
public class WindowsConditon implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata annotatedTypeMetadata) {
//获取运行的环境
Environment environment = context.getEnvironment();
//获取操作系统名称
String os = environment.getProperty("os.name");
if(os.contains("Windows")){
return true;
}
return false;
}
}
(2)新增LinuxConditon,实现Conditon接口
package com.qxf.condition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @Auther: qiuxinfa
* @Date: 2019/12/15
* @Description: 判断当前操作系统是否为Linux
*/
public class LinuxConditon implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata annotatedTypeMetadata) {
//获取IOC容器使用的bean工厂
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//获取类加载器
ClassLoader classLoader = context.getClassLoader();
//获取bean定义的注册类
BeanDefinitionRegistry registry = context.getRegistry();
//获取运行的环境
Environment environment = context.getEnvironment();
//获取操作系统名称
String os = environment.getProperty("os.name");
if(os.contains("Linux")){
return true;
}
return false;
}
}
(3)修改配置类ComponentRegistryConfig,添加带有条件注解的2个bean,只有满足条件才会注册bean
package com.qxf.config;
import com.qxf.condition.LinuxConditon;
import com.qxf.condition.MyImportBeanDefinitionRegistrar;
import com.qxf.condition.MyImportSelector;
import com.qxf.condition.WindowsConditon;
import com.qxf.pojo.Person;
import com.qxf.pojo.Student;
import com.qxf.pojo.Teacher;
import org.springframework.context.annotation.*;
/**
* @Auther: qiuxinfa
* @Date: 2019/12/15
* @Description: com.qxf.config
*/
@Configuration //表示这是一个配置类
@ComponentScan(basePackages = "com.qxf") //包扫描
@Import({Teacher.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class ComponentRegistryConfig {
@Scope("prototype") //默认为singleton
@Bean
public Person person123(){
return new Person("张三",22);
}
@Conditional(WindowsConditon.class) //满足条件才注册bean
@Bean("currentPerson")
public Person bill(){
return new Person("Bill",64);
}
@Conditional(LinuxConditon.class) //满足条件才注册bean
@Bean("currentPerson")
public Person linus(){
return new Person("Linus",49);
}
}
(4)测试方法
//可以设置虚拟机参数VM options:-Dos.name=Linux来模拟当前操作系统的参数
@Test
public void testCondition(){
Environment environment = context.getEnvironment();
//获取当前运行的环境
String osName = environment.getProperty("os.name");
//获取当前操作系统的名称
System.out.println("当前操作系统-->"+osName);
//获取条件注册的bean
Person currentPerson = (Person) context.getBean("currentPerson");
System.out.println("currentPerson-->"+currentPerson);
}
(5)测试结果
可以看到,当前操作系统为Windows 7,所以打印的是比尔盖茨。
当然可以通过设置虚拟机参数来修改环境变量os.name的值,IntelliJ IDEA 的方法是,在Edit Configuration->VM options里面设置虚拟机参数为:-Dos.name=Linux
然后测试结果就变成下面的样子了:
说明条件注解@Conditional是有效果的。