底层注解-@Conditional 条件装配
# 70.底层注解-@Conditional 条件装配
条件装配:满足 Conditional 指定的条件,则进行组件注入
@Conditional 是一个根注解,有很多派生的注解。我们可以在 IDEA 中,双击 shift,在类中查找@Conditional:
然后在类上按下 Ctrl + H,找到继承的类:
每个继承的注解都有各自的左右。例如
- @ConditionalOnBean,就是说如果容器中有某个组件,则该注解配置的组件就会被注入到容器;
- @ConditionalMissingBean,如果没有某个组件,则注入
- @ConditionalOnClass,有某个类的时候,则注入
- @ConditionalOnMissingClass,没有某个类的时候,则注入
- @ConditionalOnResource,类路径中存在某个资源的时候,则注入
- @ConditionalOnJava,符合某个 Java 版本号的时候,则注入
- @ConditionalOnWebApplication,是 web 应用的时候,则注入
- @ConditionalOnProperty,配置文件中有某个配置项的时候,则注入
- ...........
# 实践
我们在 MyConfig
类中,取消注入 Pet 组件:
// @Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
1
2
3
4
2
3
4
在 MainApplication
类中,判断下有没 Pet 和 user 组件:
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
boolean tom = run.containsBean("tom");
System.out.println("容器中Tom组件:" + tom);
boolean user01 = run.containsBean("user01");
System.out.println("容器中user01组件:" + user01);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
运行结果:
容器中Tom组件:false
容器中user01组件:true
1
2
2
如果我们加上了@ConditionalOnBean:
@ConditionalOnBean(name = "tom")
@Bean //给容器中添加组件,以方法名作为组件的id,返回类型就是组件类型,返回的值,就是组件在容器中的实例
public User user01(){
User zhangsan = new User("zhangsan",18);
// user组件依赖了pet组件
zhangsan.setPet(tomcatPet());
return zhangsan;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
运行结果:
容器中Tom组件:false
容器中user01组件:false
1
2
2
# 加在方法上
除了将该注解标注在方法上,还可以标注在类上。如果这样做,只有容器中存在某个组件的时候,该类里配置的组件才会注入
# 最后
在 SpringBoot 的底层,会有很多的条件装配,随着后续的学习,我们会逐步认识自动装配的重要性。
同学们也可自行尝试其他@Conditional 的衍生注解。
已将本文源码上传到 Gitee (opens new window) 或 GitHub (opens new window) 的分支 demo5,读者可以通过切换分支来查看本文的示例代码
上次更新: 2024/10/3 10:01:52
- 01
- 中国网络防火长城简史 转载10-12
- 03
- 公告:博客近期 RSS 相关问题10-02