0
点赞
收藏
分享

微信扫一扫

Spring Boot-@Conditional注解以及衍生注解@ConditionalOnBean


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

Spring Boot-@Conditional注解以及衍生注解@ConditionalOnBean_spring


Spring Boot-@Conditional注解以及衍生注解@ConditionalOnBean_spring_02


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

Spring Boot-@Conditional注解以及衍生注解@ConditionalOnBean_配置文件_03

那我们怎么查看哪些自动配置类生效了呢

可以通过debug模式

1.application.properties配置以下内容

Spring Boot-@Conditional注解以及衍生注解@ConditionalOnBean_注解_04


2.启动运行我们就可以查看到哪些自动配置类生效了

Positive matches:代表生效的自动配置类

Negative matches:没有生效的自动配置类

Spring Boot-@Conditional注解以及衍生注解@ConditionalOnBean_spring_05

然后通过实例进行测试 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,则这个配置类中的内容不在执行


举报

相关推荐

0 条评论