日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot 自动配置之条件注解

發布時間:2025/6/17 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 自动配置之条件注解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。