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

SpringBoot @Import與@Conditional注解使用詳解

 更新時(shí)間:2022年10月13日 16:21:47   作者:一根頭發(fā)學(xué)一年  
在了解spring boot自動(dòng)配置原理前,再來了解下兩個(gè)注解@Import注解和@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件給容器注冊(cè)bean

說明:基于atguigu學(xué)習(xí)筆記。

在了解spring boot自動(dòng)配置原理前,再來了解下兩個(gè)注解@Import注解和@Conditional注解。

@Import

@Import注解主要用于導(dǎo)入某些特殊的Bean,這些特殊的Bean和Bean Definitaion 有關(guān)。

主要用于導(dǎo)入@Configuration 類,ImportSelector和ImportBeanDefinitionRegistrar接口的實(shí)現(xiàn)類。

@Import可以添加在@SpringBootApplication(啟動(dòng)類)、@Configuration(配置類)、@Component(組件類)對(duì)應(yīng)的類上。

一般在Spring boot 中配置都一般都是自動(dòng)導(dǎo)入的,所以我們不需要使用@Import,但是如果你你想導(dǎo)入的配置類不在自動(dòng)掃包路徑,那么該配置類就需要使用@Import導(dǎo)入,尤其是第三方j(luò)ar包的配置類都需要借助@Import來導(dǎo)入。

這里我們首先熟悉基本語法,具體的用法后面再學(xué)。

示例:

還使用上一章里項(xiàng)目示例:@Configuration注解和@Bean注解

使用 @Import導(dǎo)入我們需要的類,這里導(dǎo)入我們自己創(chuàng)建的類和第三方logback jar包里的類,如下:

config類:

package com.example.ethan.config;
import ch.qos.logback.core.db.DBHelper;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods=true)
public class ConfigDemo {
    @Bean
    public User user01(){
        User zhangsan = new User("zhangsan", 18);
        //user組件依賴了Dept組件
        zhangsan.setDept(rd());
        return zhangsan;
    }
    @Bean("my rd")
    public Dept rd(){
        return new Dept("研發(fā)部");
    }
}

主程序

package com.example.ethan;
import ch.qos.logback.core.db.DBHelper;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import com.example.ethan.config.ConfigDemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class EthanApplication {
    public static void main(String[] args) {
        // 返回ioc容器
        ConfigurableApplicationContext run = SpringApplication.run(EthanApplication.class, args);
        // 只查看User類型的Bean
        String[] beanDefinitionNames = run.getBeanNamesForType(User.class);
        System.out.println("========================");
        for (String name : beanDefinitionNames) {
            System.out.println(name);
        }
        DBHelper bean = run.getBean(DBHelper.class);
        System.out.println(bean);
        // com.example.ethan.bean.User
        //user01
        //ch.qos.logback.core.db.DBHelper@67207d8a
    }
}

可以看到,使用 @Import注解,會(huì)給容器中自動(dòng)創(chuàng)建出這兩個(gè)類型的Bean,且Bean的名字是全類名。

@Conditional

滿足Conditional指定的條件,則進(jìn)行注入指定Bean。

@Conditional是一個(gè)根注解,下面還派生了許多其他注解

@Conditional注解可以加在方法上也可以加在類上。當(dāng)加在類上,當(dāng)條件不成立,類中所有代碼都不執(zhí)行,如果加在方法上,則只這個(gè)方法不執(zhí)行。

下面以@ConditionalOnBean(條件是判斷是否含有某個(gè)Bean)為例,演示代碼如下:

首先放在方法上:

package com.example.ethan.config;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods=true)
public class ConfigDemo {
    @Bean("my rd")
    public Dept rd(){
        return new Dept("研發(fā)部");
    }
    @Bean
    @ConditionalOnBean(name = "my rd")
    public User user01(){
        User zhangsan = new User("zhangsan", 18);
        //user組件依賴了Dept組件
        zhangsan.setDept(rd());
        return zhangsan;
    }
}

主程序:

package com.example.ethan;
import ch.qos.logback.core.db.DBHelper;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import com.example.ethan.config.ConfigDemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class EthanApplication {
    public static void main(String[] args) {
        // 返回ioc容器
        ConfigurableApplicationContext run = SpringApplication.run(EthanApplication.class, args);
        boolean my_rd = run.containsBean("my rd");
        System.out.println("容器中含有my rd這個(gè)Bean:" + my_rd);
        boolean user01 = run.containsBean("user01");
        System.out.println("容器中含有user01這個(gè)Bean:" + user01);
    }
}

這時(shí)候兩個(gè)好結(jié)果都是true,因?yàn)榘凑枕樞蜃⑷隑ean時(shí),先注入了"my rd"這個(gè)Bean到容器,然后在注入user01時(shí),檢查容器中含有my rd"這個(gè)Bean,就把user01也注入了。

如果把條件里name改為不存在的如"my rd02",那么入user01就不會(huì)注入容器。

下面把注解放到類上:

package com.example.ethan.config;
import com.example.ethan.bean.Dept;
import com.example.ethan.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods=true)
@ConditionalOnBean(name = "my rd")
public class ConfigDemo {
    @Bean("my rd")
    public Dept rd(){
        return new Dept("研發(fā)部");
    }
    @Bean
    public User user01(){
        User zhangsan = new User("zhangsan", 18);
        //user組件依賴了Dept組件
        zhangsan.setDept(rd());
        return zhangsan;
    }
}

這時(shí)候兩個(gè)Bean都不會(huì)注入容器,因?yàn)樵趫?zhí)行這個(gè)類時(shí)檢查條件不成立。

這里對(duì)@ConditionalOnBean有個(gè)初步了解,具體何種用法類似,可舉一反三。

參考:

SpringBoot之@Import注解使用

到此這篇關(guān)于SpringBoot @Import與@Conditional注解使用詳解的文章就介紹到這了,更多相關(guān)SpringBoot @Import與@Conditional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解springboot如何更新json串里面的內(nèi)容

    詳解springboot如何更新json串里面的內(nèi)容

    這篇文章主要為大家介紹了springboot 如何更新json串里面的內(nèi)容,文中有詳細(xì)的解決方案供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • IDEA使用Tomcat運(yùn)行web項(xiàng)目教程分享

    IDEA使用Tomcat運(yùn)行web項(xiàng)目教程分享

    在非Spring Boot項(xiàng)目中運(yùn)行Nacos示例,需要手動(dòng)配置Tomcat容器,本文介紹了如何在IDEA中配置Tomcat,并詳細(xì)解決了配置過程中可能遇到的異常情況,步驟包括修改IDEA項(xiàng)目結(jié)構(gòu)、添加Web模塊、配置Artifacts和Tomcat Server
    2024-10-10
  • springboot如何使用MybatisPlus

    springboot如何使用MybatisPlus

    MyBatisPlus是一個(gè)強(qiáng)大的數(shù)據(jù)庫操作框架,其代碼生成器可以快速生成實(shí)體類、映射文件等,本文介紹了如何導(dǎo)入MyBatisPlus相關(guān)依賴,創(chuàng)建代碼生成器,并配置數(shù)據(jù)庫信息以逆向生成代碼,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • SpringCloud聲明式Feign客戶端調(diào)用工具使用

    SpringCloud聲明式Feign客戶端調(diào)用工具使用

    這篇文章主要為大家介紹了SpringCloud聲明式Feign客戶端調(diào)用工具使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java中MapStruct映射處理器報(bào)錯(cuò)的問題解決

    Java中MapStruct映射處理器報(bào)錯(cuò)的問題解決

    MapStruct是一個(gè)強(qiáng)大的Java映射框架,它能夠在編譯時(shí)生成映射代碼,,本文主要介紹了Java中MapStruct映射處理器報(bào)錯(cuò)的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java中Cookie和Session的那些事兒

    Java中Cookie和Session的那些事兒

    Cookie和Session都是為了保持用戶的訪問狀態(tài),一方面為了方便業(yè)務(wù)實(shí)現(xiàn),另一方面為了簡(jiǎn)化服務(wù)端的程序設(shè)計(jì)。這篇文章主要介紹了java中cookie和session的知識(shí),需要的朋友可以參考下
    2016-09-09
  • 用Java進(jìn)行zip文件壓縮與解壓縮

    用Java進(jìn)行zip文件壓縮與解壓縮

    這篇文章主要介紹了用Java進(jìn)行zip文件壓縮與解壓縮的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • controller函數(shù)中參數(shù)列表使用多個(gè)@RequestBody問題

    controller函數(shù)中參數(shù)列表使用多個(gè)@RequestBody問題

    這篇文章主要介紹了controller函數(shù)中參數(shù)列表使用多個(gè)@RequestBody問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • springboot單元測(cè)試兩種方法實(shí)例詳解

    springboot單元測(cè)試兩種方法實(shí)例詳解

    這篇文章主要介紹了springboot單元測(cè)試兩種方法實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java多線程之等待隊(duì)列DelayQueue詳解

    Java多線程之等待隊(duì)列DelayQueue詳解

    這篇文章主要介紹了Java多線程之等待隊(duì)列DelayQueue詳解,    DelayQueue被稱作"等待隊(duì)列"或"JDK延遲隊(duì)列",存放著實(shí)現(xiàn)了Delayed接口的對(duì)象,對(duì)象需要設(shè)置到期時(shí)間,當(dāng)且僅當(dāng)對(duì)象到期,才能夠從隊(duì)列中被取走(并非一定被取走),需要的朋友可以參考下
    2023-12-12

最新評(píng)論