Spring Boot 自动配置之条件注解
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 自动配置之条件注解相关推荐
- Spring Boot自动配置与Spring 条件化配置
SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...
- Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...
- Spring Boot自动配置原理
要了解Spring Boot的自动配置首先我需要先了解Spring Boot的两个机制,一个是配置文件如何进入到系统变成属性,二是如何将这些属性加入到容器中. 首先我们需要有一个组件,这个组件中的属性 ...
- Spring Boot - 自动配置实例解读
文章目录 Pre 启用 debug=true输出自动配置 HttpEncodingAutoConfiguration 什么情况下,Spring Boot 会自动装配 HttpEncodingAutoC ...
- 芋道 Spring Boot 自动配置原理
转载自 芋道 Spring Boot 自动配置原理 1. 概述 友情提示:因为本文是分享 Spring Boot 自动配置的原理,所以需要胖友有使用过 Spring Boot 的经验.如果还没使用过 ...
- Spring Boot 自动配置的 “魔法” 是如何实现的?
转载自 Spring Boot 自动配置的 "魔法" 是如何实现的? Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数 ...
- 【Spring Boot实战】源码解析Spring Boot自动配置原理
一.简介 Spring致力于让Java开发更简单,SpringBoot致力于让使用Spring进行Java开发更简单,SpringCloud致力于基于SpringBoot构建微服务生态圈,让微服务开发 ...
- 学习第三篇:【SpringBoot-Labs】芋道 Spring Boot 自动配置原理
本周(8.21-8.27)将学习芋道 Spring Boot的以下文章: 8.21: 快速入门 8.22:Spring Boot 自动配置原理 .Jar 启动原理 8.23:调试环境. 热部署入门.消 ...
- Spring Boot自动配置原理、实战
Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...
最新文章
- 通过正则表达式校验手机号码,拿走即用!
- PyTorch GPU安装指南 (Ubuntu 16.04 anaconda cuda8.0 cuDNN6.0)
- html不可选择的按钮,HTML功能无法使用按钮
- 2018 年视频监控企业竞争力分析 海康威视连续七年蝉联全球第一
- 【汇编语言】程序设计过程,如何避免数据类型匹配错误?
- linux 库的头文件安装在,“找不到jpeg的头文件或库文件”在Alpine Linux上安装枕头...
- ASP.NET定制简单的错误处理页面
- Python yaml处理
- 生产计划管理制造系统模块化
- [NOIP]2017列队——旋转treap/非旋转treap
- WeixinJSBridge API使用实例
- Python爬虫(十二)_XPath与lxml类库
- 《TensorFlow技术解析与实战》——3.3 可视化的例子
- 12.28 笔记 (集合) --- 耐得住寂寞
- PMP项目管理证书有用吗?
- 微信公众平台编辑器教程-微信公众号使用教程32
- 少林寺公布武功秘籍 揭开绝技神秘面纱(组图)
- 电脑不分盘有没有关系
- Qt编程中的信号和槽机制
- Flask学习笔记(四): Flask与数据库连接
热门文章
- poj 1961 Period(KMP)
- 转!!配置Tomcat时server.xml和content.xml自动还原问题
- poj 2891 Strange Way to Express Integers 2012-09-05
- Tomcat+JSP经典配置实例
- nodejs-文件系统
- hdu1255 扫描线,矩形重叠面积(两次以上)
- hdu4814 模拟(黄金分割进制转换)
- 【数字信号处理】相关函数 ( 周期信号 | 周期信号的自相关函数 )
- 【Java 虚拟机原理】垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )
- 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )