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

Spring @Conditional注解講解及示例詳解

 更新時間:2019年12月16日 14:29:09   作者:徐勤奮  
這篇文章主要介紹了Spring @Conditional注解講解及示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言:

@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件給容器注冊bean。

@Conditional的定義:

//此注解可以標(biāo)注在類和方法上
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME) 
@Documented
public @interface Conditional {
  Class<? extends Condition>[] value();
}

從代碼中可以看到,需要傳入一個Class數(shù)組,并且需要繼承Condition接口:

public interface Condition {
  boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}

Condition是個接口,需要實(shí)現(xiàn)matches方法,返回true則注入bean,false則不注入。

示例:

首先,創(chuàng)建Person類:

public class Person {
 
  private String name;
  private Integer age;
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
 
  public Integer getAge() {
    return age;
  }
 
  public void setAge(Integer age) {
    this.age = age;
  }
 
  public Person(String name, Integer age) {
    this.name = name;
    this.age = age;
  }
 
  @Override
  public String toString() {
    return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
  }
}

創(chuàng)建BeanConfig類,用于配置兩個Person實(shí)例并注入,一個是比爾蓋茨,一個是林納斯。

@Configuration
public class BeanConfig {
 
  @Bean(name = "bill")
  public Person person1(){
    return new Person("Bill Gates",62);
  }
 
  @Bean("linus")
  public Person person2(){
    return new Person("Linus",48);
  }
}

接著寫一個測試類進(jìn)行驗(yàn)證這兩個Bean是否注入成功。

public class ConditionalTest {
 
  AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
 
  @Test
  public void test1(){
    Map<String, Person> map = applicationContext.getBeansOfType(Person.class);
    System.out.println(map);
  }
}

運(yùn)行,輸出結(jié)果是這樣的,兩個Person實(shí)例被注入進(jìn)容器。

這是一個簡單的例子,現(xiàn)在問題來了,如果我想根據(jù)當(dāng)前操作系統(tǒng)來注入Person實(shí)例,windows下注入bill,linux下注入linus,怎么實(shí)現(xiàn)呢?

這就需要我們用到@Conditional注解了,前言中提到,需要實(shí)現(xiàn)Condition接口,并重寫方法來自定義match規(guī)則。

首先,創(chuàng)建一個WindowsCondition類:

public class WindowsCondition implements Condition {
 
  /**
   * @param conditionContext:判斷條件能使用的上下文環(huán)境
   * @param annotatedTypeMetadata:注解所在位置的注釋信息
   * */
  @Override
  public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    //獲取ioc使用的beanFactory
    ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
    //獲取類加載器
    ClassLoader classLoader = conditionContext.getClassLoader();
    //獲取當(dāng)前環(huán)境信息
    Environment environment = conditionContext.getEnvironment();
    //獲取bean定義的注冊類
    BeanDefinitionRegistry registry = conditionContext.getRegistry();
 
    //獲得當(dāng)前系統(tǒng)名
    String property = environment.getProperty("os.name");
    //包含Windows則說明是windows系統(tǒng),返回true
    if (property.contains("Windows")){
      return true;
    }
    return false;
  }
}

matches方法的兩個參數(shù)的意思在注釋中講述了,值得一提的是,conditionContext提供了多種方法,方便獲取各種信息,也是SpringBoot中 @ConditonalOnXX注解多樣擴(kuò)展的基礎(chǔ)。

接著,創(chuàng)建LinuxCondition類:

public class LinuxCondition implements Condition {
 
  @Override
  public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
 
    Environment environment = conditionContext.getEnvironment();
 
    String property = environment.getProperty("os.name");
    if (property.contains("Linux")){
      return true;
    }
    return false;
  }
}

接著就是使用這兩個類了,因?yàn)榇俗⒔饪梢詷?biāo)注在方法上和類上,所以分開測試:

標(biāo)注在方法上:

修改BeanConfig:

@Configuration
public class BeanConfig {
 
  //只有一個類時,大括號可以省略
  //如果WindowsCondition的實(shí)現(xiàn)方法返回true,則注入這個bean  
  @Conditional({WindowsCondition.class})
  @Bean(name = "bill")
  public Person person1(){
    return new Person("Bill Gates",62);
  }
 
  //如果LinuxCondition的實(shí)現(xiàn)方法返回true,則注入這個bean
  @Conditional({LinuxCondition.class})
  @Bean("linus")
  public Person person2(){
    return new Person("Linus",48);
  }
}

修改測試方法,使其可以打印當(dāng)前系統(tǒng)名:

@Test
  public void test1(){
    String osName = applicationContext.getEnvironment().getProperty("os.name");
    System.out.println("當(dāng)前系統(tǒng)為:" + osName);
    Map<String, Person> map = applicationContext.getBeansOfType(Person.class);
    System.out.println(map);
  }

運(yùn)行結(jié)果如下:

我是運(yùn)行在windows上的所以只注入了bill,嗯,沒毛病。

接著實(shí)驗(yàn)linux下的情況,不能運(yùn)行在linux下,但可以修改運(yùn)行時參數(shù):

修改后啟動測試方法:

一個方法只能注入一個bean實(shí)例,所以@Conditional標(biāo)注在方法上只能控制一個bean實(shí)例是否注入。

標(biāo)注在類上:

一個類中可以注入很多實(shí)例,@Conditional標(biāo)注在類上就決定了一批bean是否注入。

我們試一下,將BeanConfig改寫,這時,如果WindowsCondition返回true,則兩個Person實(shí)例將被注入(注意:上一個測試將os.name改為linux,這是我將把這個參數(shù)去掉):

@Conditional({WindowsCondition.class})
@Configuration
public class BeanConfig {
 
  @Bean(name = "bill")
  public Person person1(){
    return new Person("Bill Gates",62);
  }
 
  @Bean("linus")
  public Person person2(){
    return new Person("Linus",48);
  }
}

結(jié)果兩個實(shí)例都被注入:

如果將類上的WindowsCondition.class改為LinuxCondition.class,結(jié)果應(yīng)該可以猜到:

結(jié)果就是空的,類中所有bean都沒有注入。

多個條件類:

前言中說,@Conditional注解傳入的是一個Class數(shù)組,存在多種條件類的情況。

這種情況貌似判斷難度加深了,測試一波,新增新的條件類,實(shí)現(xiàn)的matches返回false(這種寫死返回false的方法純屬測試用,沒有實(shí)際意義O(∩_∩)O)

public class ObstinateCondition implements Condition {
 
  @Override
  public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
     return false;
  }
}

BeanConfig修改一下:

@Conditional({WindowsCondition.class,ObstinateCondition.class})
@Configuration
public class BeanConfig {
 
  @Bean(name = "bill")
  public Person person1(){
    return new Person("Bill Gates",62);
  }
 
  @Bean("linus")
  public Person person2(){
    return new Person("Linus",48);
  }
}

結(jié)果:

現(xiàn)在如果將ObstinateCondition的matches方法返回值改成true,兩個bean就被注入進(jìn)容器:

結(jié)論得:

第一個條件類實(shí)現(xiàn)的方法返回true,第二個返回false,則結(jié)果false,不注入進(jìn)容器。

第一個條件類實(shí)現(xiàn)的方法返回true,第二個返回true,則結(jié)果true,注入進(jìn)容器中。

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

相關(guān)文章

  • 在SpringBoot中使用jwt實(shí)現(xiàn)token身份認(rèn)證的實(shí)例代碼

    在SpringBoot中使用jwt實(shí)現(xiàn)token身份認(rèn)證的實(shí)例代碼

    你還不會在SpringBoot中使用jwt實(shí)現(xiàn)token身份認(rèn)證嗎,本文小編就給大家詳細(xì)的介紹一下在SpringBoot中使用jwt實(shí)現(xiàn)token身份認(rèn)證的實(shí)例代碼,感興趣的同學(xué)可以自己動手試一試
    2023-09-09
  • java多線程并發(fā)executorservice(任務(wù)調(diào)度)類

    java多線程并發(fā)executorservice(任務(wù)調(diào)度)類

    這篇文章主要介紹了線程并發(fā)ScheduledExecutorService類,設(shè)置 ScheduledExecutorService ,2秒后,在 1 分鐘內(nèi)每 10 秒鐘蜂鳴一次
    2014-01-01
  • IntelliJ IDEA 詳細(xì)圖解最常用的配置(適合剛剛用的新人)

    IntelliJ IDEA 詳細(xì)圖解最常用的配置(適合剛剛用的新人)

    這篇文章主要介紹了IntelliJ IDEA 詳細(xì)圖解最常用的配置,本篇教程非常適合剛剛用的新人,本文圖文并茂給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • mybatis plus in方法使用說明

    mybatis plus in方法使用說明

    這篇文章主要介紹了mybatis plus in方法使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java實(shí)現(xiàn)斗地主之洗牌發(fā)牌

    Java實(shí)現(xiàn)斗地主之洗牌發(fā)牌

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)斗地主之洗牌發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源

    SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源

    咱們開發(fā)項(xiàng)目的過程中用到很多的開源數(shù)據(jù)庫鏈接池,比如druid、c3p0、BoneCP等等,本文主要介紹了SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • scala 操作數(shù)據(jù)庫的方法

    scala 操作數(shù)據(jù)庫的方法

    這篇文章主要介紹了scala 操作數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Javaweb開發(fā)中通過Servlet生成驗(yàn)證碼圖片

    Javaweb開發(fā)中通過Servlet生成驗(yàn)證碼圖片

    這篇文章主要為大家詳細(xì)介紹了Javaweb開發(fā)中通過Servlet生成驗(yàn)證碼圖片的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Spring觀察者模式之事件發(fā)布訂閱實(shí)現(xiàn)和源碼詳解

    Spring觀察者模式之事件發(fā)布訂閱實(shí)現(xiàn)和源碼詳解

    這篇文章主要介紹了Spring觀察者模式之事件發(fā)布訂閱實(shí)現(xiàn)和源碼詳解,Spring認(rèn)為發(fā)布訂閱主題,其實(shí)可以理解為事件驅(qū)動的編碼,先來實(shí)現(xiàn)以下Spring容器中的事件發(fā)布訂閱,需要的朋友可以參考下
    2024-01-01
  • 一文搞懂Spring中的Bean作用域

    一文搞懂Spring中的Bean作用域

    scope用來聲明容器中的對象所應(yīng)該處的限定場景或者說該對象的存活時間,即容器在對象進(jìn)入其 相應(yīng)的scope之前,生成并裝配這些對象,在該對象不再處于這些scope的限定之后,容器通常會銷毀這些對象,這篇文章主要介紹了Spring中的Bean作用域,需要的朋友可以參考下
    2022-06-06

最新評論

象州县| 侯马市| 安泽县| 日喀则市| 通辽市| 阿坝县| 宁德市| 皋兰县| 泰安市| 嫩江县| 宜阳县| 彝良县| 大厂| 泸溪县| 清徐县| 孝昌县| 察雅县| 肇州县| 无为县| 潞城市| 胶南市| 鹤庆县| 安仁县| 马关县| 汉中市| 简阳市| 涞水县| 宝鸡市| 朝阳市| 丘北县| 广汉市| 农安县| 南召县| 大英县| 洛宁县| 阳信县| 古蔺县| 侯马市| 邯郸县| 平顶山市| 鸡泽县|