其他分享
首页 > 其他分享> > 【SpringBoot_ANNOTATIONS】06 @Conditional 按照条件注册bean

【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;
    }
}

注意

  1. 实现Condition接口的时候注意导的包
  2. 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