本篇介绍下,如何通过springboot的条件配置,控制Bean的创建
- 介绍下开发环境
- JDK版本1.8
- springboot版本是1.5.2
- 开发工具为 intellij idea(2018.2)
- 开发环境为 15款MacBook Pro
前言
很多时候,我们在公司用springboot作为基础框架开发项目的时候,会遇见创建BeanB的时候,需要BeanA已经创建好了,也就是根据条件来判断,是否创建该BeanB,这边写个教程,给各位作参考
如何弄条件配置呢?
这次,我们只在同一个项目内的 @Configuration 配合 @Bean 做演示,实际情况下,比较推荐用类注解 @Component 配合条件注解使用,下面演示的,只是比较常用的一些条件配置注解,并不包含所有
-
我们先创建一个普通的spring-boot项目,记得添加web依赖,否则,项目不会后台运行
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
-
创建一个测试条件配置的类(不跟启动类一个目录下,最好单独创建一个目录)
@Configuration public class SpecialBeanFactory { @Bean public A buildA(){ return new A(); } @Bean // 如果存在Bean A,则创建Bean B @ConditionalOnBean(A.class) public B buildB(){ return new B(); } @Bean // 目录下犹如包含E.class 则创建Bean C @ConditionalOnClass(E.class) public C buildC(){ return new C(); } @Bean @ConditionalOnMissingClass(value = "W") public D buildD(){ return new D(); } @Bean // 如果不存在Bean E 那么创建Bean F @ConditionalOnMissingBean(E.class) public F buildF(){ return new F(); } @Bean // 属性文件如果存在 key=hexiaowu value= nan 的则创建BeanH @ConditionalOnProperty(value = "hexiaowu",havingValue = "nan") public H buildH(){ return new H(); } }
-
然后我们在启动下启动类,会看到如下日志
2018-10-18 20:08:49.732 INFO 24960 --- [ main] com.example.conditionBase.vo.A : 创建 A 2018-10-18 20:08:49.733 INFO 24960 --- [ main] com.example.conditionBase.vo.B : 创建 B 2018-10-18 20:08:49.734 INFO 24960 --- [ main] com.example.conditionBase.vo.C : 创建 C 2018-10-18 20:08:49.735 INFO 24960 --- [ main] com.example.conditionBase.vo.D : 创建 D 2018-10-18 20:08:49.736 INFO 24960 --- [ main] com.example.conditionBase.vo.F : 创建 F
-
打印上面日志,说明条件配置生效了
关于条件配置
使用条件配置,我们需要配置的东西很少,也就新增条件配置注解
条件配置官方文档地址如下: 条件配置官方文档
注解 | 使用 |
---|---|
@ConditionalOnBean | 如果注解内的Bean存在,那么则创建注解类或者方法返回的Bean |
@ConditionalOnClass | 如果注解内classpath下存在某个class,那么创建注解类或者方法返回的Bean |
@ConditionalOnMissingClass | 如果注解内classpath没有该class名称,那么创建注解类或者方法返回的Bean |
@ConditionalOnMissingBean | 如果注解内的Bean不存在,那么创建注解类或者方法返回的Bean |
@ConditionalOnProperty | 如果属性文件内,包含注解内对应的属性名称跟值,那么创建注解类或者方法返回的Bean |
注意
注意: 在配合 @Bean
注解跟条件注解使用创建Bean的时候,需要注意的是, @Bean
注解是跟@Configuration
注解配合外部配置的,也就是跟 @ComponentScan
扫描有不同的区别,扫描会有依赖(生成一个有向图的依赖,个人猜测,没具体研究过源码),但是 @Bean
却没有, 例如: 在配置注解 @Configuration
类下 创建B Bean,需要A Bean不存在,如果创建B Bean的方法在创建A Bean前面,那么B跟A都会创建,如果创建A在创建B前面,那边B则不会创建,需要注意,如果是通过扫描的,则不用担心这点,
结束语
本次介绍的,只是比较常用的,并没有介绍全,例如: 自定义条件配置,以及资源条件配置等,并未介绍,下篇介绍
项目源码,我已经上传到gitee
需要的朋友,可以自己点击查看 springboot条件配置
到这,文章就结束了!
以上,均为本人测试而得出的结果,可能会有出入,或者错误,欢迎指正
欢迎转载,请注明出处跟作者,谢谢!