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

淺析SpringBoot2底層注解@Conditional@ImportResource

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

SpringBoot2底層注解

一、@ImportResource

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

另外@Conditional是個(gè)根注解,在idea里使用 ctrl+H 可以打開它的結(jié)構(gòu)。

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

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

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

@ConditionalOnClass:當(dāng)容器中存在指定的類。

@ConditionalOnMissingClass:當(dāng)容器中不存在指定的類。

@ConditionalOnResource:項(xiàng)目類路徑里存在某個(gè)資源的時(shí)候。

@ConditionalOnJava:當(dāng)是指定的 java 版本號。

@ConditionalOnWebApplication:當(dāng)應(yīng)用是一個(gè) web 應(yīng)用的時(shí)候。

@ConditionalOnNotWebApplication:當(dāng)應(yīng)用不是一個(gè) web 應(yīng)用的時(shí)候。

@ConditionalOnProperty:當(dāng)配置文件里存在指定屬性的時(shí)候。

示例

以@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這個(gè)組件給注釋掉,現(xiàn)在tomcatPet()其實(shí)就是個(gè)普通的類方法。

先嘗試在主運(yùn)行類的 main 方法里獲取一下 這 2 個(gè) 組件:

@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);
    }
}

運(yùn)行一下,查看結(jié)果:

果然,是不存在pet1組件的,因?yàn)锧bean這個(gè)注解被我注釋掉了。

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

這時(shí)候就可以使用@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"),當(dāng)沒有pet1組件,就不注冊user1組件。

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

作用在類上

@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)在就表示,當(dāng)存在pet1組件的時(shí)候,這個(gè)類下面的所有才會生效。

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

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

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

運(yùn)行一下:

因?yàn)椴淮嬖趐et1這個(gè)組件,所有MyConfig類下面的2個(gè)組件user1和pet22的注冊都不生效。

二、@ImportResource

@ImportResource注解是用來導(dǎo)入資源。

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

... ...
    <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,實(shí)際工程中可能會存在很多 bean,如果想要逐個(gè)遷移成注解的方式,會很麻煩。

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

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

因?yàn)檫@些組件聲明在 xml 里,springboot 也并不知道這些是干嘛的。

這時(shí)候就可以使用@ImportResource來導(dǎo)入這些組件:

//@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");
    }
}

這個(gè)時(shí)候再運(yùn)行測試一下:

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

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

相關(guān)文章

  • java異步編程之一文看完其異步函數(shù)表

    java異步編程之一文看完其異步函數(shù)表

    這篇文章主要為大家介紹了java異步編程之一文看完其異步函數(shù)表示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 解決myBatis generator逆向生成沒有根據(jù)主鍵的select,update和delete問題

    解決myBatis generator逆向生成沒有根據(jù)主鍵的select,update和delete問題

    這篇文章主要介紹了解決myBatis generator逆向生成沒有根據(jù)主鍵的select,update和delete問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 解決Java中的java.io.IOException: Broken pipe問題

    解決Java中的java.io.IOException: Broken pipe問題

    這篇文章主要介紹了解決Java中 java.io.IOException: Broken pipe的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Security6.4.2?自定義異常中統(tǒng)一響應(yīng)遇到的問題

    Security6.4.2?自定義異常中統(tǒng)一響應(yīng)遇到的問題

    本文主要介紹了Security6.4.2?自定義異常中統(tǒng)一響應(yīng)遇到的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Java設(shè)計(jì)模式之適配器模式

    Java設(shè)計(jì)模式之適配器模式

    這篇文章介紹了Java設(shè)計(jì)模式之適配器模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Spring Security 強(qiáng)制退出指定用戶的方法

    Spring Security 強(qiáng)制退出指定用戶的方法

    本篇文章主要介紹了Spring Security 強(qiáng)制退出指定用戶的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 詳解Java如何使用責(zé)任鏈默認(rèn)優(yōu)雅地進(jìn)行參數(shù)校驗(yàn)

    詳解Java如何使用責(zé)任鏈默認(rèn)優(yōu)雅地進(jìn)行參數(shù)校驗(yàn)

    項(xiàng)目中參數(shù)校驗(yàn)十分重要,它可以保護(hù)我們應(yīng)用程序的安全性和合法性。這篇文章主要介紹了如何使用責(zé)任鏈默認(rèn)優(yōu)雅地進(jìn)行參數(shù)校驗(yàn),需要的可以參考一下
    2023-03-03
  • 多個(gè)JDK版本(Java 8、Java 17、Java 21)下載和切換

    多個(gè)JDK版本(Java 8、Java 17、Java 21)下載和切換

    為了在實(shí)際中可以任意選擇所需的JDK版本,需要將多個(gè)JDK版本進(jìn)行切換,本文主要介紹了多個(gè)JDK版本(Java 8、Java 17、Java 21)下載和切換,感興趣的可以了解一下
    2025-04-04
  • mybatis中一對一關(guān)系association標(biāo)簽的使用

    mybatis中一對一關(guān)系association標(biāo)簽的使用

    這篇文章主要介紹了mybatis中一對一關(guān)系association標(biāo)簽的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 關(guān)于Spring中聲明式事務(wù)的使用詳解

    關(guān)于Spring中聲明式事務(wù)的使用詳解

    Spring中事務(wù)分為編程式事務(wù)和聲明式事務(wù),編程式事務(wù)由于需要在代碼中硬編碼,在實(shí)際項(xiàng)目開發(fā)中比較少用到,實(shí)際開發(fā)中用的比較多的就是聲明式事務(wù),這篇文章主要給大家介紹了關(guān)于Spring中聲明式事務(wù)使用的相關(guān)資料,需要的朋友可以參考下
    2021-08-08

最新評論

彭阳县| 通道| 铁岭县| 博罗县| 榆树市| 吉首市| 吉安市| 饶河县| 大港区| 张北县| 南郑县| 温宿县| 广汉市| 乌兰县| 乌兰浩特市| 防城港市| 前郭尔| 保山市| 大厂| 西畴县| 军事| 宁武县| 夏邑县| 黄冈市| 方城县| 财经| 贵德县| 岑溪市| 福泉市| 泸西县| 云梦县| 南涧| 枣庄市| 丰原市| 德州市| 通许县| 防城港市| 芜湖市| 五大连池市| 安新县| 雷山县|