天天看點

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是有效果的。