一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring Boot 自動配置之條件注解淺析

Spring Boot 自動配置之條件注解淺析

2021-07-16 16:02來醉一場 Java教程

這篇文章主要介紹了Spring Boot 自動配置之條件注解淺析,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

spring boot 神奇的自動配置,主要依靠大量的條件注解來使用配置自動化。

根據滿足某一個特定條件創建一個特定的bean。比如說,在某些系統變量下創建bean,或者只有在某個bean創建后才去創建另外一個bean. 就是根據條件來控制bean的創建行為,可以利用該特性來進行一些自動配置。

一、常用的條件注解

  • @conditional 依賴的條件
  • @conditionalonbean  在某個bean存在的條件下
  • @conditionalonmissingbean 在某個bean不存在的條件下
  • @conditionalonclass  在某個class存在的條件下
  • @conditionalonmissingclass  在某個class不存在的條件下

比較常見的是這些注解,還有其它的比如 @conditionalonwebapplication,@conditionalonproperty 等,可舉一反三

二、特別說明 @conditional 注解

?
1
2
3
4
5
6
7
8
9
10
11
12
@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 接口是一個函數式接口

?
1
2
3
4
5
@functionalinterface
public interface condition {
 
 boolean matches(conditioncontext context, annotatedtypemetadata metadata);
}

三、條件注解示例

示例場景:項目中動態的配置mysql或者oracle數據源

1. 定義配置文件

?
1
db-type=oracle

2. 定義condition類

mysqlcondition.java

?
1
2
3
4
5
6
7
public class mysqlcondition implements condition {
 
  @override
  public boolean matches(conditioncontext context, annotatedtypemetadata metadata) {
    return "mysql".equals(context.getenvironment().getproperty("db-type"));
  }
}

oraclecondition.java

?
1
2
3
4
5
6
7
public class oraclecondition implements condition {
 
  @override
  public boolean matches(conditioncontext context, annotatedtypemetadata metadata) {
    return "oracle".equals(context.getenvironment().getproperty("db-type"));
  }
}

獲取配置文件db-type的值

3. jdbcfactory接口

?
1
2
3
4
public interface jdbcfactory {
 
  void create();
}

4. 默認的mysql和oracle實現

mysql

?
1
2
3
4
5
6
7
8
9
10
11
@conditionalonmissingbean(value = jdbcfactory.class, ignored = mysqldefaultfactory.class)
@conditional(mysqlcondition.class)
@component
public class mysqldefaultfactory implements jdbcfactory {
 
  @override
  public void create() {
    system.out.println("default mysql create ..");
  }
 
}

oracle

?
1
2
3
4
5
6
7
8
9
10
@conditionalonmissingbean(value = jdbcfactory.class, ignored = oracledefaultfactory.class)
@conditional(oraclecondition.class)
@component
public class oracledefaultfactory implements jdbcfactory {
 
  @override
  public void create() {
    system.out.println("default oracle create..");
  }
}

5. 測試默認實現方式

?
1
2
3
4
5
6
7
@resource
private jdbcfactory jdbcfactory;
 
@test
public void conditiononmissbean() {
  jdbcfactory.create();
}

結果:default mysql create ..

6. 自定義實現方式

?
1
2
3
4
5
6
7
8
@component
public class mysqlfactory implements jdbcfactory {
 
  @override
  public void create() {
    system.out.println("mysql 。。 create");
  }
}

7. 測試

?
1
2
3
4
5
6
7
@resource
private jdbcfactory jdbcfactory;
 
@test
public void conditiononmissbean() {
  jdbcfactory.create();
}

結果:mysql 。。 create

8.解析

當環境中不存在 jdbcfactory 的bean時則使用默認的實現的方式,如例:沒有自定義實現時,則默認使用mysqldefaultfactory。這在自動化配置中會經常用到。比如redistemplate 的默認實現

四、github源碼

源碼地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://juejin.im/post/5c6c2189e51d45713911466d

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2018av在线 | 十八女下面流水不遮免费 | 四虎永久免费地址 | 欧美日韩精品一区二区三区高清视频 | 亚洲网站在线观看 | 国产精品久久久久久网站 | 香蕉在线精品一区二区 | 爽新片xxxxxxx| 天天干天天操天天碰 | 欧美夫妇野外交换hd高清版 | 国产一区国产二区国产三区 | 99精品国产高清自在线看超 | 国内精品自产拍在线观看91 | 久久综合色超碰人人 | 韩国三级年轻小的胰子完整 | 国产三区二区 | 免费看美女被靠到爽的视频 | 国产拍拍 | 小早川怜子视频在线观看 | 91精品国产99久久 | 亚洲男人精品 | 亚洲国产一区二区三区a毛片 | 午夜人妻理论片天堂影院 | 亚洲天堂网在线观看视频 | 午夜精品久久久久久 | 国产精品va在线观看不 | 国产探花视频在线观看 | 天美影视文化传媒mv免费 | 亚洲精品一区二区三区在线看 | 亚洲国产第一区二区香蕉日日 | 亚洲成片在线看 | 本站只有精品 | 欧美高清videosex极品 | 国产伦精品一区二区三区免费观看 | 亚洲 在线 日韩 欧美 | 短篇艳妇系列 | 欧美视频在线一区 | 天天舔天天射 | 激情文学综合网 | 国产在线xvideos | 日韩精品免费看 |