最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 自動(dòng)配置之條件注解淺析

 更新時(shí)間:2019年02月20日 10:34:21   作者:來(lái)醉一場(chǎng)  
這篇文章主要介紹了Spring Boot 自動(dòng)配置之條件注解淺析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Spring Boot 神奇的自動(dòng)配置,主要依靠大量的條件注解來(lái)使用配置自動(dòng)化。

根據(jù)滿足某一個(gè)特定條件創(chuàng)建一個(gè)特定的Bean。比如說(shuō),在某些系統(tǒng)變量下創(chuàng)建Bean,或者只有在某個(gè)Bean創(chuàng)建后才去創(chuàng)建另外一個(gè)Bean. 就是根據(jù)條件來(lái)控制Bean的創(chuàng)建行為,可以利用該特性來(lái)進(jìn)行一些自動(dòng)配置。

一、常用的條件注解

  • @Conditional 依賴的條件
  • @ConditionalOnBean  在某個(gè)Bean存在的條件下
  • @ConditionalOnMissingBean 在某個(gè)Bean不存在的條件下
  • @ConditionalOnClass  在某個(gè)Class存在的條件下
  • @ConditionalOnMissingClass  在某個(gè)Class不存在的條件下

比較常見(jiàn)的是這些注解,還有其它的比如 @ConditionalOnWebApplication,@ConditionalOnProperty 等,可舉一反三

二、特別說(shuō)明 @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注解,對(duì)象需要實(shí)現(xiàn)Condition接口,Condition 接口是一個(gè)函數(shù)式接口

@FunctionalInterface
public interface Condition {

 boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

三、條件注解示例

示例場(chǎng)景:項(xiàng)目中動(dòng)態(tài)的配置Mysql或者Oracle數(shù)據(jù)源

1. 定義配置文件

db-type=oracle

2. 定義Condition類(lèi)

MySqlCondition.java

public class MySqlCondition implements Condition {

  @Override
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return "mysql".equals(context.getEnvironment().getProperty("db-type"));
  }
}

OracleCondition.java

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接口

public interface JdbcFactory {

  void create();
}

4. 默認(rèn)的Mysql和Oracle實(shí)現(xiàn)

Mysql

@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

@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. 測(cè)試默認(rèn)實(shí)現(xiàn)方式

@Resource
private JdbcFactory jdbcFactory;

@Test
public void conditionOnMissBean() {
  jdbcFactory.create();
}

結(jié)果:Default MySql create ..

6. 自定義實(shí)現(xiàn)方式

@Component
public class MysqlFactory implements JdbcFactory {

  @Override
  public void create() {
    System.out.println("mysql 。。 create");
  }
}

7. 測(cè)試

@Resource
private JdbcFactory jdbcFactory;

@Test
public void conditionOnMissBean() {
  jdbcFactory.create();
}

結(jié)果:mysql 。。 create

8.解析

當(dāng)環(huán)境中不存在 JdbcFactory 的Bean時(shí)則使用默認(rèn)的實(shí)現(xiàn)的方式,如例:沒(méi)有自定義實(shí)現(xiàn)時(shí),則默認(rèn)使用MySqlDefaultFactory。這在自動(dòng)化配置中會(huì)經(jīng)常用到。比如redisTemplate 的默認(rèn)實(shí)現(xiàn)

四、GitHub源碼

源碼地址

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java算法之桶排序Bucket?Sort詳解

    Java算法之桶排序Bucket?Sort詳解

    這篇文章主要介紹了Java算法之桶排序Bucket?Sort詳解,桶排序(Bucket?Sort)又稱箱排序,是一種比較常用的排序算法,其算法原理是將數(shù)組分到有限數(shù)量的桶里,再對(duì)每個(gè)桶分別排好序,最后一次將每個(gè)桶中排好序的數(shù)輸出,需要的朋友可以參考下
    2023-10-10
  • java實(shí)現(xiàn)抽獎(jiǎng)功能解析

    java實(shí)現(xiàn)抽獎(jiǎng)功能解析

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 最新評(píng)論

    隆化县| 田林县| 乐业县| 云梦县| 固镇县| 柯坪县| 信丰县| 嘉义市| 芜湖市| 阜阳市| 西充县| 德兴市| 望谟县| 康保县| 竹溪县| 鲁甸县| 汉阴县| 伊金霍洛旗| 托克逊县| 遂昌县| 佛山市| 英吉沙县| 西乡县| 花莲市| 嘉义县| 葵青区| 盐亭县| 黔东| 扶绥县| 绵竹市| 德惠市| 徐汇区| SHOW| 环江| 白银市| 永平县| 凭祥市| 托里县| 丰都县| 萍乡市| 顺义区|