接着上篇内容: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是有效果的。