天天看点

spring注解开发(二、组件注册之条件注册)

       接着上篇内容: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)测试结果

spring注解开发(二、组件注册之条件注册)

可以看到,当前操作系统为Windows 7,所以打印的是比尔盖茨。

当然可以通过设置虚拟机参数来修改环境变量os.name的值,IntelliJ IDEA 的方法是,在Edit Configuration->VM options里面设置虚拟机参数为:-Dos.name=Linux

spring注解开发(二、组件注册之条件注册)

然后测试结果就变成下面的样子了:

spring注解开发(二、组件注册之条件注册)

说明条件注解@Conditional是有效果的。