【SpringBoot_ANNOTATIONS】06 @Conditional 按照条件注册bean
作者:互联网
SpringBoot底层大量使用的注解,表示按照一定的条件进行判断,若满足条件则给容器中注册bean
@Test
void conditionTest(){
//配置类测试
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
System.out.println("容器创建完毕");
System.out.println("准备获取bean...");
Map<String, Person> beansOfType = applicationContext.getBeansOfType(Person.class);
for (String person:beansOfType.keySet()){
System.out.println(beansOfType.get(person));
}
}
MainConfig2.java
@Configuration
public class MainConfig2 {
// 由于容器中已经有了一个名为"person"的bean, 所以如果再注入"person"的时候会报错 需要修改下注入的bean的名称
// @Scope("prototype")
@Bean("person2")
public Person person(){
System.out.println("person2创建中...");
return new Person("qd2",22);
}
@Bean("bill")
public Person person1(){
System.out.println("bill创建中...");
return new Person("bill",62);
}
@Bean("linus")
public Person person2(){
System.out.println("linus创建中...");
return new Person("linus",48);
}
}
加上条件判断
LinuxCondition.java
package com.example.annotations.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;
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 获取IOC使用的beanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
// 获取类加载器
ClassLoader classLoader = context.getClassLoader();
// 获取bean定义的注册类
BeanDefinitionRegistry registry = context.getRegistry();
// 获取当前环境信息
Environment environment = context.getEnvironment();
// 动态获取环境变量的值
String property = environment.getProperty("os.name");
if (property.contains("Linux")){
System.out.println("the running environment is 'Linux'");
return true;
}
return false;
}
}
注意
- 实现
Condition
接口的时候注意导的包BeanDefinitionRegistry registry = context.getRegistry();
所有bean定义都在这个类,也可以用其来注册/移除/查询/一个bean定义
WindowsCondition.class
package com.example.annotations.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;
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 获取运行时环境
Environment environment = context.getEnvironment();
// 动态获取环境变量的值
String property = environment.getProperty("os.name");
// 匹配环境
if (property.contains("Windows")){
System.out.println("the running environment is 'Windows'");
return true;
}
return false;
}
}
@Configuration
public class MainConfig2 {
// 由于容器中已经有了一个名为"person"的bean, 所以如果再注入"person"的时候会报错 需要修改下注入的bean的名称
@Bean("person2")
public Person person(){
System.out.println("person2创建中...");
return new Person("qd2",22);
}
@Conditional(WindowsCondition.class)
@Bean("bill")
public Person person1(){
System.out.println("bill创建中...");
return new Person("bill",62);
}
@Conditional(LinuxCondition.class)
@Bean("linus")
public Person person2(){
System.out.println("linus创建中...");
return new Person("linus",48);
}
}
运行结果;
标签:06,SpringBoot,Conditional,System,Person,context,println,public,out 来源: https://blog.csdn.net/u013140841/article/details/119034852