springBoot条件配置

原创
2018/10/19 00:28
阅读数 460

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建

  • 介绍下开发环境
    • JDK版本1.8
    • springboot版本是1.5.2
    • 开发工具为 intellij idea(2018.2)
    • 开发环境为 15款MacBook Pro

前言

很多时候,我们在公司用springboot作为基础框架开发项目的时候,会遇见创建BeanB的时候,需要BeanA已经创建好了,也就是根据条件来判断,是否创建该BeanB,这边写个教程,给各位作参考


如何弄条件配置呢?

这次,我们只在同一个项目内的 @Configuration 配合 @Bean 做演示,实际情况下,比较推荐用类注解 @Component 配合条件注解使用,下面演示的,只是比较常用的一些条件配置注解,并不包含所有

  1. 我们先创建一个普通的spring-boot项目,记得添加web依赖,否则,项目不会后台运行

    	<dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
    
  2. 创建一个测试条件配置的类(不跟启动类一个目录下,最好单独创建一个目录)

     @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();
    	    }
     }
    
  3. 然后我们在启动下启动类,会看到如下日志

    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
    
  4. 打印上面日志,说明条件配置生效了


关于条件配置

使用条件配置,我们需要配置的东西很少,也就新增条件配置注解

条件配置官方文档地址如下: 条件配置官方文档

注解 使用
@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条件配置

到这,文章就结束了!

以上,均为本人测试而得出的结果,可能会有出入,或者错误,欢迎指正

欢迎转载,请注明出处跟作者,谢谢!

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部