欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析SpringBoot2底層注解@Conditional@ImportResource

 更新時間:2022年05月28日 09:14:06   作者:把蘋果咬哭的測試筆記  
這篇文章主要為大家介紹了SpringBoot2底層注解@Conditional@ImportResource的分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

SpringBoot2底層注解

一、@ImportResource

@Conditional注解,是根據(jù)條件進行裝配。滿足了 Conditional 指定的條件,就進行組件的注入。

另外@Conditional是個根注解,在idea里使用 ctrl+H 可以打開它的結構。

可以看到有許多的派生注解,每個注解都代表著一種功能。比如:

@ConditionalOnBean:當容器中存在指定的組件,才會做某些事情。

@ConditionalOnMissingBean:當容器中沒有指定的組件,才會做某些事情。

@ConditionalOnClass:當容器中存在指定的類。

@ConditionalOnMissingClass:當容器中不存在指定的類。

@ConditionalOnResource:項目類路徑里存在某個資源的時候。

@ConditionalOnJava:當是指定的 java 版本號。

@ConditionalOnWebApplication:當應用是一個 web 應用的時候。

@ConditionalOnNotWebApplication:當應用不是一個 web 應用的時候。

@ConditionalOnProperty:當配置文件里存在指定屬性的時候。

示例

以@ConditionalOnBean為例,演示一下用法。

還是看一下之前 MyConfig 類中的方法:

@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
    @Bean("user1")
    public User user01(){
        User pingguo = new User("pingguo",20);
        pingguo.setPet(tomcatPet());
        return pingguo;
    }
//    @Bean("pet1")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

在這里,我把pet1這個組件給注釋掉,現(xiàn)在tomcatPet()其實就是個普通的類方法。

先嘗試在主運行類的 main 方法里獲取一下 這 2 個 組件:

@SpringBootApplication(scanBasePackages = "com.pingguo")
public class MainApplication {
    public static void main(String[] args) {
        // 返回IOC容器
        final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        boolean tomcatPet = run.containsBean("pet1");
        System.out.println("容器中存在 pet1 的組件:" + tomcatPet);
        boolean user1 = run.containsBean("user1");
        System.out.println("容器中存在 user1 的組件:" + user1);
    }
}

運行一下,查看結果:

果然,是不存在pet1組件的,因為@bean這個注解被我注釋掉了。

OK,現(xiàn)在我有個需求,因為user1組件依賴pet1組件,如果沒有pet1,我希望user1組件也直接別注冊了。

這時候就可以使用@ConditionalOnBean注解來完成。

@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
    @ConditionalOnBean(name = "pet1")
    @Bean("user1")
    public User user01(){
        User pingguo = new User("pingguo",20);
        pingguo.setPet(tomcatPet());
        return pingguo;
    }
//    @Bean("pet1")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

在 user1組件上加上@ConditionalOnBean(name = "pet1"),當沒有pet1組件,就不注冊user1組件。

現(xiàn)在再運行 main 方法測試一下,應該都是 false,2個組件都不存在。

作用在類上

@ConditionalOnBean(name = "pet1")如果我放在類上:

@ConditionalOnBean(name = "pet1") // 放在類上
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
    @Bean("user1")
    public User user01(){
        User pingguo = new User("pingguo",20);
        pingguo.setPet(tomcatPet());
        return pingguo;
    }
    @Bean("pet22")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

現(xiàn)在就表示,當存在pet1組件的時候,這個類下面的所有才會生效。

這里我改了下面的組件注冊變成pet22,也就是說當存在pet1組件的時候,就會注冊user1和pet22。

在 main 方法里增加打印pet22,查看是否存在:

... ...
    boolean pet22 = run.containsBean("pet22");
    System.out.println("容器中存在 pet22 的組件:" + pet22);
... ...

運行一下:

因為不存在pet1這個組件,所有MyConfig類下面的2個組件user1和pet22的注冊都不生效。

二、@ImportResource

@ImportResource注解是用來導入資源。

比如,之前我們可能會在 spring 配置文件中寫非常多的組件導入:

... ...
    <bean id="haha" class="com.pingguo.boot.bean.User">
        <property name="name" value="pingguo"></property>
        <property name="age" value="20"></property>
    </bean>
    <bean id="hehe" class="com.pingguo.boot.bean.User">
        <property name="name" value="tomcat"></property>
    </bean>

這里只是demo,實際工程中可能會存在很多 bean,如果想要逐個遷移成注解的方式,會很麻煩。

但是現(xiàn)在容器里又是沒有這些組件的,在 main 方法里輸出測試一下:

boolean haha = run.containsBean("haha");
    System.out.println("容器中存在 haha 的組件:" + haha);
    boolean hehe = run.containsBean("hehe");
    System.out.println("容器中存在 hehe 的組件:" + hehe);

因為這些組件聲明在 xml 里,springboot 也并不知道這些是干嘛的。

這時候就可以使用@ImportResource來導入這些組件:

//@ConditionalOnBean(name = "pet1")
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
@ImportResource("classpath:beans.xml")  //配置文件的類路徑 
public class MyConfig {
    @Bean("user1")
    public User user01(){
        User pingguo = new User("pingguo",20);
        pingguo.setPet(tomcatPet());
        return pingguo;
    }
    @Bean("pet22")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

這個時候再運行測試一下:

xml 配置文件里的組件被成功解析注冊到了容器中。

以上就是淺析SpringBoot2底層注解@Conditional@ImportResource的詳細內容,更多關于SpringBoot2底層注解的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot中的PUT和Delete請求使用

    SpringBoot中的PUT和Delete請求使用

    這篇文章主要介紹了SpringBoot中的PUT和Delete請求使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • SpringBoot工程打包與運行的實現(xiàn)詳解

    SpringBoot工程打包與運行的實現(xiàn)詳解

    本文主要介紹了SpringBoot工程的打包與運行的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • SpringBoot中swagger的使用

    SpringBoot中swagger的使用

    這篇文章主要介紹了SpringBoot中swagger的使用,文中有非常詳細的代碼示例,對正在學習swagger的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • 深入了解Java語言中的并發(fā)性選項有何不同

    深入了解Java語言中的并發(fā)性選項有何不同

    這篇文章主要介紹了深入了解Java語言中的并發(fā)性選項有何不同,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • Java中匿名類的兩種實現(xiàn)方式

    Java中匿名類的兩種實現(xiàn)方式

    本文主要介紹了Java中匿名類的兩種實現(xiàn)方式。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • java的時間類匯總(齊全)

    java的時間類匯總(齊全)

    這篇文章主要介紹了java的時間類匯總(齊全),文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-09-09
  • SpringBoot自動配置Quartz的實現(xiàn)步驟

    SpringBoot自動配置Quartz的實現(xiàn)步驟

    本文主要介紹了SpringBoot自動配置Quartz的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • springboot使用shiro-整合redis作為緩存的操作

    springboot使用shiro-整合redis作為緩存的操作

    這篇文章主要介紹了springboot使用shiro-整合redis作為緩存的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作

    Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作

    這篇文章主要介紹了Java8 Stream對兩個 List 遍歷匹配數(shù)據(jù)的優(yōu)化處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java遍歷properties文件操作指南

    java遍歷properties文件操作指南

    在java項目開發(fā)過程中,使用properties文件作為配置基本上是必不可少的,有很多如系統(tǒng)配置信息,java如何遍歷properties文件呢,本文將詳細介紹,希望可以幫助到您
    2012-11-11

最新評論