@Conditional:判断@Conditional指定的条件是否成立,如果成立才会给容器中添加组件,配置类里面的内容才会生效

在这里插入图片描述
在这里插入图片描述
我们发现有很多的自动配置类,但是这些自动配置类都有指定的条件,必须满足这些条件,自动配置才会生效,比如在这里插入图片描述


那我们怎么查看哪些自动配置类生效了呢
可以通过debug模式
1.application.properties配置以下内容
在这里插入图片描述
2.启动运行我们就可以查看到哪些自动配置类生效了
Positive matches:代表生效的自动配置类
Negative matches:没有生效的自动配置类
在这里插入图片描述


然后通过实例进行测试 1.编写Admin类

/**
 * @author:抱着鱼睡觉的喵喵
 * @date:2020/12/22
 * @description:
 */
public class Admin {
    private String name;
    private String img;

    public Admin() {
    }

    public Admin(String name, String img) {
        this.name = name;
        this.img = img;
    }

    @Override
    public String toString() {
        return "admin{" +
                "name='" + name + '\'' +
                ", img='" + img + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2.编写配置类

@Configuration(proxyBeanMethods = true)//proxyBeanMethods = true为默认值
public class MyConfig {

//    @Bean("admin")
    public Admin admin(){
        return new Admin("jerry","@the");
    }
}

3.主配置文件

@SpringBootApplication
public class SpringBootOnApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run=SpringApplication.run(SpringBootOnApplication.class, args);

        boolean admin = run.containsBean("admin");
        System.out.println(admin);
    }

}

结果:false
说明容器中没有这个组件

-将配置类中的组件导入

@Configuration(proxyBeanMethods = true)//proxyBeanMethods = true为默认值
public class MyConfig {

    @Bean("admin")
    public Admin admin(){
        return new Admin("jerry","@the");
    }
}

结果:true

那么真正的测试就开始了,使用衍生注解@ConditionOnBean

编写User类

public class User {

    private String username;

    private String password;

    private int age;

    private Admin admin;

    public Admin getAdmin() {
        return admin;
    }

    public void setAdmin(Admin admin) {
        this.admin = admin;
    }

    public User() {
    }

    public User(String username, String password, int age) {
        this.username = username;
        this.password = password;
        this.age = age;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", admin=" + admin +
                '}';
    }
}

配置类中增加组件导入,使用@ConditionOnBean注解进行判断
下面的意思是如果容器中不存在admin组件,则也不导入hao组件

@Configuration(proxyBeanMethods = true)
public class MyConfig {

    @ConditionalOnBean(name = "admin")
    @Bean("hao")
    public User user(){
        User tom = new User("tom", "123", 20);
        //hao组件依赖了admin组件
        tom.setAdmin(admin());
        return tom;
    }

    @Bean("admin")
    public Admin admin(){
        return new Admin("jerry","@the");
    }
}

主配置文件

@SpringBootApplication
public class SpringBootOnApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run=SpringApplication.run(SpringBootOnApplication.class, args);

   
        boolean user = run.containsBean("hao");
        System.out.println(user);
         boolean admin = run.containsBean("admin");
        System.out.println(admin);
    }

}

运行结果:
false
true

为什么会这样呢?分析流程可得,把配置类中的admin组件注册放在user组件注册之后,当程序运行时,执行到user()方法时,由于加了@ConditionOnBean注解,所以会进行判断,看容器中是否存在admin组件,由于admin()方法还未执行,所以容器中没有admin组件;所以此时@ConditionOnBean注解返回false,则不再执行user()方法;即user组件不再导入

我们将改变组件的导入顺序

@Configuration(proxyBeanMethods = true)
public class MyConfig {

	@Bean("admin")
    public Admin admin(){
        return new Admin("jerry","@the");
    }

    @ConditionalOnBean(name = "admin")
    @Bean("hao")
    public User user(){
        User tom = new User("tom", "123", 20);
        //hao组件依赖了admin组件
        tom.setAdmin(admin());
        return tom;
    }

   
}

再次运行
结果:
true
true


将@ConditionalOnBean注解添加到类的上面

@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean (name = "admin")
public class MyConfig {



    
    @Bean("user")
    public User user(){

        //hao组件依赖了admin组件
        return new User("tom", "123", 20);
    }

    @Bean("admin")
    public Admin admin(){
        return new Admin("jerry","@the");
    }
}

运行结果:
false
false

这就很容易了,由于事先容器中没有admin组件,所以此时ConditionalOnBean返回false,则这个配置类中的内容不在执行

posted on 2020-12-16 16:32  凸凸大军的一员  阅读(439)  评论(0编辑  收藏  举报