當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Boot 自动配置之条件注解
生活随笔
收集整理的這篇文章主要介紹了
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=oracle2. 定義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 。。 create8.解析
當環境中不存在 JdbcFactory 的Bean時則使用默認的實現的方式,如例:沒有自定義實現時,則默認使用MySqlDefaultFactory。這在自動化配置中會經常用到。比如redisTemplate 的默認實現
四、GitHub源碼
源碼地址
轉載于:https://my.oschina.net/u/3555293/blog/3012166
總結
以上是生活随笔為你收集整理的Spring Boot 自动配置之条件注解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于django的视频点播网站开发-st
- 下一篇: css学习笔记2--多重边框