溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot2底層注解@Conditional和@ImportResource怎么使用

發(fā)布時(shí)間:2022-05-30 10:35:25 來源:億速云 閱讀:228 作者:zzz 欄目:開發(fā)技術(shù)

這篇“SpringBoot2底層注解@Conditional和@ImportResource怎么使用”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“SpringBoot2底層注解@Conditional和@ImportResource怎么使用”文章吧。

    SpringBoot2底層注解

    一、@ImportResource

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

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

    SpringBoot2底層注解@Conditional和@ImportResource怎么使用

    可以看到有許多的派生注解,每個(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é)果:

    SpringBoot2底層注解@Conditional和@ImportResource怎么使用

    果然,是不存在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è)組件都不存在。

    SpringBoot2底層注解@Conditional和@ImportResource怎么使用

    作用在類上

    @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)行一下:

    SpringBoot2底層注解@Conditional和@ImportResource怎么使用

    因?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);

    SpringBoot2底層注解@Conditional和@ImportResource怎么使用

    因?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)行測試一下:

    SpringBoot2底層注解@Conditional和@ImportResource怎么使用

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

    以上就是關(guān)于“SpringBoot2底層注解@Conditional和@ImportResource怎么使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI