5.组件注册-@Conditional-按照条件注册bean

了解过springBoot自动配置原理的同学,应该知道@Conditional注解在底层应用很广
总结:
**@Conditional({Condition}) :
1.按照一定的条件进行判断,满足条件给容器中注册bean
2.implements Condition
3.注解都可以加在方法上或者类上,相应的生效影响范围自然是 改方法的组件或者该类的组件
**

public class MainConfig2020 {
	@Bean("bill")
	public Person person01(){
		return new Person("Bill Gates",62);
	}
	@Bean("linus")
	public Person person02(){
		return new Person("linus", 48);
	}
}
	@Test
	public void test03(){
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2020.class);
		String[] namesForType = applicationContext.getBeanNamesForType(Person.class);
		Map<String, Person> persons = applicationContext.getBeansOfType(Person.class);
		System.out.println(persons);
	}

测试 首先两个bean都是在IOC容器中的,

{bill=Person [name=Bill Gates, age=62, nickName=null], linus=Person [name=linus, age=48, nickName=null]}

我们想到linux系统时才注册linus,改怎么做呢 @Conditional(LinuxCondition.class)

public class MainConfig2020 {
	@Bean("bill")
	public Person person01(){
		return new Person("Bill Gates",62);
	}
	@Conditional(LinuxCondition.class)
	@Bean("linus")
	public Person person02(){
		return new Person("linus", 48);
	}
}
//判断是否linux系统
public class LinuxCondition implements Condition {
	/**
	 * ConditionContext:判断条件能使用的上下文(环境)
	 * AnnotatedTypeMetadata:注释信息
	 */
	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		// TODO是否linux系统
		//1、能获取到ioc使用的beanfactory,就是创建对象以及装配的工厂
		ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
		//2、获取类加载器
		ClassLoader classLoader = context.getClassLoader();
		//3、获取当前环境信息
		Environment environment = context.getEnvironment();
		//4、获取到bean定义的注册类,可以在此查有没有那个bean的定义
		BeanDefinitionRegistry registry = context.getRegistry();
		String property = environment.getProperty("os.name");
		//可以判断容器中的bean注册情况,也可以给容器中注册bean
		boolean definition = registry.containsBeanDefinition("person");
		if(property.contains("linux")){
			return true;
		}
		return false;
	}
}

测试结果在Windows 情况下只会注册Bill bean

Windows 8.1
bill
{bill=Person [name=Bill Gates, age=62, nickName=null]}

当切换linux环境时,两个都会被加载注册
在这里插入图片描述

linux
bill
linus
{bill=Person [name=Bill Gates, age=62, nickName=null], linus=Person [name=linus, age=48, nickName=null]}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值