2019独角兽企业重金招聘Python工程师标准>>>

Spring Boot 神奇的自动配置,主要依靠大量的条件注解来使用配置自动化。

根据满足某一个特定条件创建一个特定的Bean。比如说,在某些系统变量下创建Bean,或者只有在某个Bean创建后才去创建另外一个Bean. 就是根据条件来控制Bean的创建行为,可以利用该特性来进行一些自动配置。

一、常用的条件注解

  • @Conditional 依赖的条件
  • @ConditionalOnBean 在某个Bean存在的条件下
  • @ConditionalOnMissingBean 在某个Bean不存在的条件下
  • @ConditionalOnClass 在某个Class存在的条件下
  • @ConditionalOnMissingClass 在某个Class不存在的条件下

比较常见的是这些注解,还有其它的比如 @ConditionalOnWebApplication, @ConditionalOnProperty 等,可举一反三

二、特别说明 @Conditional 注解

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {/*** All {@link Condition Conditions} that must {@linkplain Condition#matches match}* in order for the component to be registered.*/Class<? extends Condition>[] value();}

使用@Conditional注解,对象需要实现Condition接口,Condition 接口是一个函数式接口

@FunctionalInterface
public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

三、条件注解示例

示例场景:项目中动态的配置Mysql或者Oracle数据源

1. 定义配置文件

db-type=oracle

2. 定义Condition类

MySqlCondition.java

public class MySqlCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return "mysql".equals(context.getEnvironment().getProperty("db-type"));}
}

OracleCondition.java

public class OracleCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return "oracle".equals(context.getEnvironment().getProperty("db-type"));}
}

获取配置文件db-type的值

3. JdbcFactory接口

public interface JdbcFactory {void create();
}

4. 默认的Mysql和Oracle实现

Mysql

@ConditionalOnMissingBean(value = JdbcFactory.class, ignored = MySqlDefaultFactory.class)
@Conditional(MySqlCondition.class)
@Component
public class MySqlDefaultFactory implements JdbcFactory {@Overridepublic void create() {System.out.println("Default MySql create ..");}}

Oracle

@ConditionalOnMissingBean(value = JdbcFactory.class, ignored = OracleDefaultFactory.class)
@Conditional(OracleCondition.class)
@Component
public class OracleDefaultFactory implements JdbcFactory {@Overridepublic void create() {System.out.println("Default oracle create..");}
}

5. 测试默认实现方式

@Resource
private JdbcFactory jdbcFactory;@Test
public void conditionOnMissBean() {jdbcFactory.create();
}

结果:

Default MySql create ..

6. 自定义实现方式

@Component
public class MysqlFactory implements JdbcFactory {@Overridepublic void create() {System.out.println("mysql 。。 create");}
}

7. 测试

@Resource
private JdbcFactory jdbcFactory;@Test
public void conditionOnMissBean() {jdbcFactory.create();
}

结果:

mysql 。。 create

8.解析

当环境中不存在 JdbcFactory 的Bean时则使用默认的实现的方式,如例:没有自定义实现时,则默认使用MySqlDefaultFactory。这在自动化配置中会经常用到。比如redisTemplate 的默认实现

四、GitHub源码

源码地址

转载于:https://my.oschina.net/u/3555293/blog/3012166

Spring Boot 自动配置之条件注解相关推荐

  1. Spring Boot自动配置与Spring 条件化配置

    SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...

  2. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  3. Spring Boot自动配置原理

    要了解Spring Boot的自动配置首先我需要先了解Spring Boot的两个机制,一个是配置文件如何进入到系统变成属性,二是如何将这些属性加入到容器中. 首先我们需要有一个组件,这个组件中的属性 ...

  4. Spring Boot - 自动配置实例解读

    文章目录 Pre 启用 debug=true输出自动配置 HttpEncodingAutoConfiguration 什么情况下,Spring Boot 会自动装配 HttpEncodingAutoC ...

  5. 芋道 Spring Boot 自动配置原理

    转载自  芋道 Spring Boot 自动配置原理 1. 概述 友情提示:因为本文是分享 Spring Boot 自动配置的原理,所以需要胖友有使用过 Spring Boot 的经验.如果还没使用过 ...

  6. Spring Boot 自动配置的 “魔法” 是如何实现的?

    转载自  Spring Boot 自动配置的 "魔法" 是如何实现的? Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数 ...

  7. 【Spring Boot实战】源码解析Spring Boot自动配置原理

    一.简介 Spring致力于让Java开发更简单,SpringBoot致力于让使用Spring进行Java开发更简单,SpringCloud致力于基于SpringBoot构建微服务生态圈,让微服务开发 ...

  8. 学习第三篇:【SpringBoot-Labs】芋道 Spring Boot 自动配置原理

    本周(8.21-8.27)将学习芋道 Spring Boot的以下文章: 8.21: 快速入门 8.22:Spring Boot 自动配置原理 .Jar 启动原理 8.23:调试环境. 热部署入门.消 ...

  9. Spring Boot自动配置原理、实战

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

最新文章

  1. 通过正则表达式校验手机号码,拿走即用!
  2. PyTorch GPU安装指南 (Ubuntu 16.04 anaconda cuda8.0 cuDNN6.0)
  3. html不可选择的按钮,HTML功能无法使用按钮
  4. 2018 年视频监控企业竞争力分析 海康威视连续七年蝉联全球第一
  5. 【汇编语言】程序设计过程,如何避免数据类型匹配错误?
  6. linux 库的头文件安装在,“找不到jpeg的头文件或库文件”在Alpine Linux上安装枕头...
  7. ASP.NET定制简单的错误处理页面
  8. Python yaml处理
  9. 生产计划管理制造系统模块化
  10. [NOIP]2017列队——旋转treap/非旋转treap
  11. WeixinJSBridge API使用实例
  12. Python爬虫(十二)_XPath与lxml类库
  13. 《TensorFlow技术解析与实战》——3.3 可视化的例子
  14. 12.28 笔记 (集合) --- 耐得住寂寞
  15. PMP项目管理证书有用吗?
  16. 微信公众平台编辑器教程-微信公众号使用教程32
  17. 少林寺公布武功秘籍 揭开绝技神秘面纱(组图)
  18. 电脑不分盘有没有关系
  19. Qt编程中的信号和槽机制
  20. Flask学习笔记(四): Flask与数据库连接

热门文章

  1. poj 1961 Period(KMP)
  2. 转!!配置Tomcat时server.xml和content.xml自动还原问题
  3. poj 2891 Strange Way to Express Integers 2012-09-05
  4. Tomcat+JSP经典配置实例
  5. nodejs-文件系统
  6. hdu1255 扫描线,矩形重叠面积(两次以上)
  7. hdu4814 模拟(黄金分割进制转换)
  8. 【数字信号处理】相关函数 ( 周期信号 | 周期信号的自相关函数 )
  9. 【Java 虚拟机原理】垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )
  10. 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )