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

聊聊SpringBoot自動(dòng)裝配的魔力

 更新時(shí)間:2021年11月17日 11:39:50   作者:liushangzaibeijing  
這篇文章主要介紹了SpringBoot自動(dòng)裝配的魔力,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、 springBoot自動(dòng)配置的好處

1、 回想一下當(dāng)你在使用spring來(lái)搭建一個(gè)項(xiàng)目的時(shí)候

你需要編寫(xiě)很多的有關(guān)spring的xml。例如讀取屬性配置的bean、數(shù)據(jù)源bean、事務(wù)管理工廠(chǎng)bean、mybatis與spring整個(gè)的bean等等。再次利用該框架搭建項(xiàng)目的時(shí)候,又是周而復(fù)始的操作。

但是現(xiàn)在當(dāng)你使用springBoot搭建項(xiàng)目的時(shí)候,你會(huì)發(fā)現(xiàn)所有的配置你都不用去編寫(xiě)就可以幫你去實(shí)現(xiàn)(僅僅需要在連接外部數(shù)據(jù)庫(kù)的時(shí)候需要進(jìn)行配置,其實(shí)如果使用內(nèi)嵌數(shù)據(jù)庫(kù)h2 則你完全不必需要application.properties配置文件)。

你可以在你的具體的業(yè)務(wù)代碼中使用@AutoWried @Resource注解將數(shù)據(jù)源,事務(wù)工廠(chǎng)等注入到業(yè)務(wù)層,像是你自己配置那樣。

2、這時(shí)我們會(huì)有一個(gè)疑問(wèn)

springBoot到底做了什么讓我們可以不用配置,而使用那些功能對(duì)象。

其實(shí)springBoot使用基于條件的自動(dòng)注入原理,即為當(dāng)滿(mǎn)足某個(gè)條件的時(shí)候,spring會(huì)實(shí)例化該注解對(duì)應(yīng)的bean,將其放入到Srping上下文中,讓你可以輕松的使用。SpringBoot實(shí)現(xiàn)條件配置離不開(kāi)它的核心組件@Conditional。

下面我們慢慢的來(lái)揭開(kāi)springBoot自動(dòng)配置的神秘面紗。

二、@Conditional注解相關(guān)介紹

1、@Conditional小demo

@Conditional 是個(gè)什么鬼,不解釋來(lái)個(gè)小的demo大致了解一下

描述一下demo場(chǎng)景 :Life實(shí)體bean在特定條件(@Conditional)下,被springBoot初始化,并放置到spring上下文環(huán)境中。

1.1、 Life 實(shí)體類(lèi)

/**
 * 夢(mèng)想存在,生命才有意義
 */
public class Life {
    //工作 
    private String work;
    //學(xué)習(xí)
    private String study
    //愛(ài)
    private String love;
 
  //省略seter /geter
 
}

1.2、 編寫(xiě)我們自己的條件匹配規(guī)則

/**
 * 實(shí)現(xiàn)ConfigurationCondition(該接口繼承了Condition)
 */
public class MyTestConditional implements ConfigurationCondition {
    /**
     * 設(shè)置使用該類(lèi)進(jìn)行解析的時(shí)機(jī)
     * 1、REGISTER_BEAN:會(huì)在注冊(cè)Bean的時(shí)候進(jìn)行condition的解析
     *  即為在對(duì)應(yīng)的@Bean注解和@condition注解組合使用的時(shí)候 進(jìn)行條件的判斷
     *  @Bean注解對(duì)應(yīng)spring 的xml的<bean/>標(biāo)簽
     * 2、PARSE_CONFIGURATION:會(huì)在解析@Configuration時(shí)進(jìn)行condition的解析
     *    即為在對(duì)應(yīng)的@Configuration注解和@condition注解組合使用的時(shí)候 進(jìn)行條件的判斷
     *    @Configuration注解對(duì)應(yīng)spring 的xml的<beans/>標(biāo)簽
     * @return
     */
    @Override
    public ConfigurationPhase getConfigurationPhase() {
        return ConfigurationPhase.REGISTER_BEAN;
    }
    /**
     * 該方法為條件判斷的核心 只有該方法返回為true 則表示其條件成立 ,執(zhí)行相應(yīng)的配置
     * @param conditionContext
     * @param annotatedTypeMetadata
     * @return
     */
    @Override
    public boolean matches(ConditionContext conditionContext, 
    AnnotatedTypeMetadata annotatedTypeMetadata) {
              return false;  //表示驗(yàn)證不通過(guò)
    }

該類(lèi)實(shí)現(xiàn)了ConfigurationCondition 有如下兩個(gè)方法

1、 getConfigurationPhase() 該條件規(guī)則起作用的時(shí)候

2、 matches()條件匹配規(guī)則 這里為了演示不做具體的邏輯條件的處理

返回一個(gè)布爾值,如果為ture 則表示條件成立 配置生效

反之不生效。

1.3、編寫(xiě)我們的java實(shí)例bean自動(dòng)配置

@Configuration
//@Configuration標(biāo)注在類(lèi)上,相當(dāng)于把該類(lèi)作為spring的xml配置文件中的<beans>,
// 作用為:配置spring容器(應(yīng)用上下文)
public class ServerAutoConfiguration {
 
    @Configuration  //spring的xml配置文件中的<beans>
    //使用該注解表明,在springBoot啟動(dòng)的時(shí)候只有滿(mǎn)足MyTestConditional.class 才生成對(duì)應(yīng)的Life 對(duì)象
    //即 MyTestConditional中的match()返回true @Bean生效
    @Conditional(MyTestConditional.class)
    public static class StudentAutoConfiguration {
        @Bean
        public Life create() {
            System.out.println("life start....");
            return new Life("努力工作","不斷的學(xué)習(xí)","敢愛(ài)敢恨");
        }
    }
}

1.4、 springBoot的單元測(cè)試

 
//使用Spring的單元測(cè)試環(huán)境
@RunWith(SpringRunner.class)
//將SpringBoot的上下文環(huán)境加載進(jìn)入單元測(cè)試中
@SpringBootTest(classes = AutoApplication.class)
public class AutoApplicationTests {
   //注入springBoot 基于條件的實(shí)例化bean
   @Autowired
   private Life life;
   @Test
   public void showlife() {
      System.out.println("生命的全部:"+life.toString());
   }
}

啟動(dòng)springBoot項(xiàng)目,在控制臺(tái)中沒(méi)有發(fā)現(xiàn)Life對(duì)象被創(chuàng)建 且單元測(cè)試中無(wú)法注入Life

在修改了MyTestConditional中的match() 返回true 再次啟動(dòng)則Life對(duì)象被創(chuàng)建

同時(shí)使用SpringBoot的單元測(cè)試來(lái)使用springBoot為我們?cè)O(shè)置的Life實(shí)體

該實(shí)體創(chuàng)建流程如下:當(dāng)springBoot項(xiàng)目啟動(dòng)的時(shí)候,會(huì)加載@Configuration(srping的xml配置)下的所有bean,當(dāng)遇到@Conditional(MyTestConditional.class) 會(huì)調(diào)用該方法的Match,并根據(jù)其返回值來(lái)判斷是否實(shí)例化該注解下的所有使用@Bean @Import 注解下的類(lèi)

三、自定義一個(gè)條件配置類(lèi)/springBoot自定義注解

1、簡(jiǎn)單解釋@Condition注解家族

(1)、@Conditional

官方文檔定義:

“Indicates that a component is only eligible for registration when all specified conditions match”

意思是只有滿(mǎn)足一些列條件之后創(chuàng)建一個(gè)bean。 并注冊(cè)到spring的上下文環(huán)境中

(2)、SpringBoot提供的

  • @ConditionalOnWebApplication 該應(yīng)用必須為web應(yīng)用
  • @ConditionalOnMissingBean 該應(yīng)用上下文中如果沒(méi)有指定的bean
  • @ConditionalOnBean 該應(yīng)用上下文中如果有指定的bean
  • @ConditionalOnProperty(name,value) 只有存在對(duì)應(yīng)name的value的配置文件才加載該注解下的bean
  • @ConditionalOnCloudPlatform 匹配當(dāng)處于云平臺(tái)環(huán)境中時(shí)后
  • @ConditionalOnClass 該classpath中如果有指定的bean @ConditionalOnExpression 如果對(duì)應(yīng)的表達(dá)式成立 成功
  • @ConditionalOnJava 根據(jù)應(yīng)用程序運(yùn)行的JVM版本進(jìn)行匹配 成功
  • @ConditionalOnRepositoryType 當(dāng)特定類(lèi)型的spring Data JPA啟用的時(shí)候 成功
  • @ConditionalOnSingleCandidate 當(dāng)特定的class對(duì)應(yīng)的bean存在且唯一確定的時(shí)候
  • @ConditionalOnJndi 通過(guò)JNDI查找制定的條件
  • @Profile 通過(guò)特定的條件觸發(fā) (生產(chǎn)環(huán)境使用該配置,非生產(chǎn)環(huán)境則不是使用)
  • @ConditionalOnResource 從資源文件中查詢(xún)
  • @ConditionalOnEnabledResourceChain 從資源鏈中中查詢(xún)
  • @ConditionalOnNotWebApplication 如果改應(yīng)用不是web應(yīng)用,則該條件起作用
  • @ConditionalOnMissingClass 如果不存在對(duì)應(yīng)的class則創(chuàng)建該對(duì)應(yīng)的bean

滿(mǎn)足條件后則加載該注解作用下的類(lèi)起作用

(3)、所謂該注解作用下的類(lèi)起作用是指

這些注解都有如下兩種使用方式

1、作用在類(lèi)上,則該類(lèi)下的所有@Bean注解起作用 (條件成立,加載該注解下的所有@Bean的實(shí)體類(lèi) 存放在spring上下文中)

2、作用在方法上 則該方法下對(duì)應(yīng)的@bean注解起作用 (條件成立,加載該注解下使用@Bean的實(shí)體類(lèi) 存放在spring上下文中)

與@Configuration或者@Bean配合使用,當(dāng)和@Configuration配合使用時(shí),

那么該類(lèi)下所有@Bean方法 或者@Import 或者 @ComponentScan都會(huì)受到其配置條件的影響

  • @Configuration 相當(dāng)于spring的xml配置文件的<beans>標(biāo)簽
  • @Bean 注解相當(dāng)于spring的xml配置文件的<bean>標(biāo)簽
  • @Import(Xxx.class)將指定的class 實(shí)例注入到spring的上下文中
  • @Configuration標(biāo)注在類(lèi)上,相當(dāng)于把該類(lèi)作為spring的xml配置文件中的<beans>,作用為:配置spring容器(應(yīng)用上下文)

2、自定義條件注解

結(jié)合demo 來(lái)設(shè)置一個(gè)自定義注解

(1)、 自定義注解

/*
  自定義的Conditional 條件注解
 */
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyTestConditional.class)
public @interface ConditionalOnLife {
    Class<?>[] value() default {};
    String[] name() default {};}

(2)、進(jìn)行配置使用

@Configuration  //spring的xml配置文件中的<beans>
//使用該注解表明,在springBoot啟動(dòng)的時(shí)候只有滿(mǎn)足MyTestConditional.class 才生成對(duì)應(yīng)的Life 對(duì)象
//自定義的條件注解
@ConditionalOnLife
//@Conditional(MyTestConditional.class)
public static class DreamAutoConfiguration {
    @Bean
    public Dream createDream() {
        //life.toString();
        System.out.println("dream start....");
        return new Dream();
    }
}

后臺(tái)調(diào)用成功創(chuàng)建了Dream實(shí)體 并放入spring上下文環(huán)境中

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot2.6.7集成springfox3.0.0的示例代碼

    springboot2.6.7集成springfox3.0.0的示例代碼

    這篇文章主要介紹了springboot2.6.7集成springfox3.0.0的示例代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Java Swing樹(shù)狀組件JTree用法實(shí)例詳解

    Java Swing樹(shù)狀組件JTree用法實(shí)例詳解

    這篇文章主要介紹了Java Swing樹(shù)狀組件JTree用法,結(jié)合具體實(shí)例形式分析了Swing組件JTree構(gòu)成樹(shù)狀列表的節(jié)點(diǎn)設(shè)置與事件響應(yīng),以及自定義圖形節(jié)點(diǎn)的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • java中的內(nèi)部類(lèi)內(nèi)部接口用法說(shuō)明

    java中的內(nèi)部類(lèi)內(nèi)部接口用法說(shuō)明

    這篇文章主要介紹了java中的內(nèi)部類(lèi)內(nèi)部接口用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Spring入門(mén)實(shí)戰(zhàn)之Profile詳解

    Spring入門(mén)實(shí)戰(zhàn)之Profile詳解

    什么是spring profile?簡(jiǎn)單講profile就是一組配置,不同profile提供不同組合的配置,程序運(yùn)行時(shí)可以選擇使用哪些profile來(lái)適應(yīng)環(huán)境。下面這篇文章主要介紹了Spring中Profile實(shí)戰(zhàn)的相關(guān)資料,需要的朋友可以參考借鑒。
    2017-02-02
  • java解決單緩沖生產(chǎn)者消費(fèi)者問(wèn)題示例

    java解決單緩沖生產(chǎn)者消費(fèi)者問(wèn)題示例

    這篇文章主要介紹了java解單緩沖生產(chǎn)者消費(fèi)者問(wèn)題示例,需要的朋友可以參考下
    2014-04-04
  • java通過(guò)jni調(diào)用opencv處理圖像的方法

    java通過(guò)jni調(diào)用opencv處理圖像的方法

    今天小編就為大家分享一篇java通過(guò)jni調(diào)用opencv處理圖像的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 分析java中全面的單例模式多種實(shí)現(xiàn)方式

    分析java中全面的單例模式多種實(shí)現(xiàn)方式

    單例模式是一種常用的軟件設(shè)計(jì)模式,單例對(duì)象的類(lèi)只能允許一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要擁有一個(gè)的全局對(duì)象,有利于協(xié)調(diào)系統(tǒng)整體的行為。比如在某個(gè)服務(wù)器程序中,該服務(wù)器的配置信息存放在一個(gè)文件中。本文將介紹它的思想和多種實(shí)現(xiàn)方式
    2021-06-06
  • Java 中的 DataInputStream 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java 中的 DataInputStream 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    DataInputStream 是數(shù)據(jù)輸入流。它繼承于FilterInputStream。接下來(lái)通過(guò)本文給大家介紹Java 中的 DataInputStream的相關(guān)知識(shí),需要的朋友參考下吧
    2017-05-05
  • Spring boot 數(shù)據(jù)庫(kù)連接斷線(xiàn)重連問(wèn)題

    Spring boot 數(shù)據(jù)庫(kù)連接斷線(xiàn)重連問(wèn)題

    這篇文章主要介紹了Spring boot 數(shù)據(jù)庫(kù)連接斷線(xiàn)重連問(wèn)題,需要的朋友可以參考下
    2017-06-06
  • springboot多文件上傳代碼實(shí)例及解析

    springboot多文件上傳代碼實(shí)例及解析

    這篇文章主要介紹了springboot多文件上傳代碼實(shí)例及解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

贡嘎县| 将乐县| 民勤县| 修文县| 舟曲县| 长海县| 襄垣县| 旬阳县| 邢台市| 犍为县| 吴堡县| 临清市| 通辽市| 盐津县| 六盘水市| 盐边县| 寿宁县| 朝阳区| 祥云县| 咸阳市| 鄂温| 万盛区| 新巴尔虎右旗| 犍为县| 荥阳市| 平安县| 海宁市| 万源市| 阿坝| 普定县| 万全县| 南昌县| 秦安县| 屯留县| 卓资县| 金门县| 邻水| 内丘县| 彰武县| 连平县| 江山市|