文档章节

springBoot条件配置

贺小五
 贺小五
发布于 10/19 00:28
字数 1059
阅读 14
收藏 0

本篇介绍下,如何通过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条件配置

到这,文章就结束了!

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

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

© 著作权归作者所有

共有 人打赏支持
贺小五

贺小五

粉丝 71
博文 42
码字总数 43196
作品 0
海淀
程序员
私信 提问
深入理解SpringBoot的过滤条件--AutoConfigure

我们知道在Spring及SpringBoot里按条件创建Bean的核心是接口与注解,其实在SpringBoot里还有一种AutoConfigure也可以来过滤配置,只不过这种技术,能够让SpringBoot更快速的启动,那么下面我们...

融科聂晨
07/23
0
0
SpringBoot自定义条件注解配置

本篇介绍下,如何通过springboot的自定义条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多...

贺小五
10/27
0
0
第一章:Maven环境下如何配置QueryDSL环境

QueryDSL是一个通用的查询框架,框架的核心原则是创建安全类型的查询,开始QueryDSL仅支持Hibernate(HQL),在不断开源人士加入QueryDSL团队后,陆续发布了针对JPA,JDO,JDBC,Lucene,Hib...

恒宇少年
2017/07/01
0
0
Spring Boot干货系列: (三)启动原理解析

     前言   前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏。所以这次博主就跟你们一起一步步...

后端编程嘟
2017/03/13
0
0
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
04/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
27分钟前
0
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
29分钟前
0
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
36分钟前
2
0
小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
今天
2
0
聊聊storm trident batch的分流与聚合

序 本文主要研究一下storm trident batch的分流与聚合 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout) .p......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部