目录
@Conditional :按照一定的条件进行判断,满足条件才给容器中注册bean,这也是springboot底层大量使用的注解
@Conditional 可以标注在类上或者方法上
package com.cjian.config;
import com.cjian.bean.Person;
import com.cjian.condition.LinuxCondition;
import com.cjian.condition.WindowsCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
/**
* @description:
* @author: CJ
* @time: 2020/10/28 9:32
*/
@Configuration //告诉spring这是一个配置类
//指定要扫描的包,以及不扫描哪些组件
@ComponentScans(value = {
@ComponentScan(value = "com.cjian")
})
public class MainConfig {
@Bean("person")
public Person person01() {
return new Person("cjian", 27);
}
//@Conditional 按照一定的条件进行判断,满足条件才给容器中注册bean,这也是springboot底层大量使用的注解
//模拟:windows环境下输出Bill,linux下输出linus
@Conditional({WindowsCondition.class})
@Bean("Bill")
public Person person02() {
return new Person("Bill gates", 62);
}
@Conditional({LinuxCondition.class})
@Bean("linus")
public Person person03() {
return new Person("linus", 48);
}
}
package com.cjian.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;
/**
* @description:
* @author: CJ
* @time: 2020/10/28 18:42
*/
public class LinuxCondition implements Condition {
/*
* ConditionContext conditionContext :判断条件能使用的上下文(环境)
* AnnotatedTypeMetadata annotatedTypeMetadata :注释信息
* */
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//能获取到ioc使用的beanFactory
ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
//获取当前环境信息
Environment environment = conditionContext.getEnvironment();
//获取类加载器
ClassLoader classLoader = conditionContext.getClassLoader();
//获取到bean定义的注册类
BeanDefinitionRegistry registry = conditionContext.getRegistry();
//判断容器中是否有id 为person 的 bean,也可以给容器中注册bean(后面说)
boolean flag = registry.containsBeanDefinition("person");
String property = environment.getProperty("os.name");
if(property.contains("linux")){
return true;
}
return false;
}
}
package com.cjian.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;
/**
* @description:
* @author: CJ
* @time: 2020/10/28 18:42
*/
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//获取当前环境信息
Environment environment = conditionContext.getEnvironment();
String property = environment.getProperty("os.name");
if(property.contains("Windows")){
return true;
}
return false;
}
}
测试代码:
标注在方法上
package com.cjian;
import com.cjian.bean.Person;
import com.cjian.config.MainConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import java.util.Map;
/**
* @description:
* @author: CJ
* @time: 2020/10/28 9:44
*/
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
MainConfig.class);
ConfigurableEnvironment environment = annotationConfigApplicationContext.getEnvironment();
//获取环境变量的值
String property = environment.getProperty("os.name");
System.out.println("当前系统:"+property);
String[] beanNamesForType = annotationConfigApplicationContext.getBeanNamesForType(Person.class);
for (String s : beanNamesForType) {
System.out.println(s);
}
Map<String, Person> persons = annotationConfigApplicationContext.getBeansOfType(Person.class);
System.out.println(persons);
}
}
输出:
当前系统:Windows 10
person
Bill
{person=Person{name='cjian', age=27}, Bill=Person{name='Bill gates', age=62}}
模拟linux环境:
-Dos.name=linux
输出:
当前系统:linux
person
linus
{person=Person{name='cjian', age=27}, linus=Person{name='linus', age=48}}
标注在类上
只有满足条件,该类的所有配置才会注册到ioc中
package com.cjian.config;
import com.cjian.bean.Person;
import com.cjian.condition.LinuxCondition;
import com.cjian.condition.WindowsCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
/**
* @description:
* @author: CJ
* @time: 2020/10/28 9:32
*/
@Configuration //告诉spring这是一个配置类
//指定要扫描的包,以及不扫描哪些组件
@ComponentScans(value = {
@ComponentScan(value = "com.cjian")
})
@Conditional({WindowsCondition.class})
public class MainConfig {
@Bean("person")
public Person person01() {
return new Person("cjian", 27);
}
//@Conditional 按照一定的条件进行判断,满足条件才给容器中注册bean,这也是springboot底层大量使用的注解
@Bean("Bill")
public Person person02() {
return new Person("Bill gates", 62);
}
@Conditional({LinuxCondition.class})
@Bean("linus")
public Person person03() {
return new Person("linus", 48);
}
}
输出:
当前系统:Windows 10
person
Bill
{person=Person{name='cjian', age=27}, Bill=Person{name='Bill gates', age=62}}
如果将 @Conditional({LinuxCondition.class}) 注释掉,linus也会注册到ioc中
模拟linux,输出:
当前系统:linux
{}