国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩欧美在线一区二区 | 亚洲精品麻豆 | 午夜视频在线观看网站 | 在线观看特色大片免费网站 | 久久久www成人免费精品 | 久久亚洲精品视频 | 精品久久一区二区三区 | 亚洲精品一区二三区不卡 | 日韩资源 | av不卡在线 | 中文字幕国产一区二区 | 日韩精品一 | 欧美一级欧美三级在线观看 | 久久久久久一区二区三区 | 成人黄色小视频 | 国产成人精品久久二区二区91 | 香蕉久久一区二区不卡无毒影院 | 一区二区三区久久久久久 | 国产男女免费视频 | 久久久久亚洲精品 | 高清二区 | 欧美日韩一区二区三区不卡视频 | 欧美一级高清免费 | 欧美精品影院 | 九九久久精品 | 欧美一区永久视频免费观看 | 国产精品久久久久久久久免费桃花 | 亚洲精品久久久久久久久久久久久 | 精品一区二区久久久久久久网站 | 午夜在线影院 | 日本电影网址 | 日日躁夜夜躁狠狠躁 | 不卡一区 | 国产主播福利 | 免费色视频 | 久久男人| 亚洲蜜桃精久久久久久久 | 亚洲精品视频在线 | 中文字幕在线免费看 | 色网站在线观看 | 亚洲精品在线视频 |