您現在的位置是:首頁 > 藝術

面試官:說說 Springboot 中的 javaConfig(基於Spring5.2)

由 愚公要移山1 發表于 藝術2022-08-29
簡介大體步驟我們可以總結一下:ConfigurationClassPostProcessor處理器解析@configuration配置類主要過程:(1)Spring容器初始化時註冊ConfigurationClassPostProcessor(

config是什麼

在Spring3。0之前,我們的bean一直透過XML檔案來配置的,後來在Spring3。0之後為我們提供了java的config版本。而且在Spring4。0之後推薦我們使用,這篇文章基於Spring5。2來分析。希望在平時使用和麵試的時候對你有一絲幫助。

一、例項演示

我們先給出一個例子,看看如何使用,然後再來分析。建立一個普通的maven專案。

第一步:新增pom依賴

面試官:說說 Springboot 中的 javaConfig(基於Spring5.2)

這裡面添加了最核心的依賴。

第二步:在bean包新增User類

面試官:說說 Springboot 中的 javaConfig(基於Spring5.2)

第三步:在service包新增UserService類

面試官:說說 Springboot 中的 javaConfig(基於Spring5.2)

注意這裡沒有@Service註解。目的就是我們自己注入。

第四步:在config包新增UserConfig類

面試官:說說 Springboot 中的 javaConfig(基於Spring5.2)

這個類是核心,我們使用了倆註解,一個Configuration還有一個Bean。我們一會就看他倆的作用。

第五步:測試

之前我們已經添加了測試依賴。直接測試一波:

面試官:說說 Springboot 中的 javaConfig(基於Spring5.2)

這就是一個最基本的案例,實現起來非常的簡單。下面我們著重分析一下這倆註解的作用,為什麼能實現類似於Spring中XML檔案一樣的作用。

二、分析

1、註解角度分析

想要了解為什麼@Configuration會有這樣的作用,我們可以跟進去這個註解看看。

面試官:說說 Springboot 中的 javaConfig(基於Spring5.2)

進去之後我們會發現,這個註解標籤是一個元註解,由很多其他的註解實現,有一個我們應該很熟悉,那就是@Component,有著了這個註解就可以被@ComponentScan掃描並處理。Spring5。0已經自動掃描了,不需要我們自己再去添加了。現在我們進去到裡面的程式碼看看:

首先是@AliasFor標籤:

在Spring的眾多註解中,經常會發現很多註解的不同屬性起著相同的作用,比如@RequestMapping的value屬性和path屬性,這就需要做一些基本的限制,比如value和path的值不能衝突,比如任意設定value或者設定path屬性的值,都能夠透過另一個屬性來獲取值等等。為了統一處理這些情況,Spring建立了@AliasFor標籤。

然後是value() :

意思是預設的值就是空,此時我們就可以指定@Configuration(value=“屬性值”)的這種方式,因為只有一個value所以value可以省去不寫。

最後是proxyBeanMethods:

有了 proxyBeanMethods 屬性後,配置類不會被代理了。主要是為了提高效能,如果你的 @Bean 方法之間沒有呼叫關係的話可以把 proxyBeanMethods 設定為 false。否則,方法內部引用的類生產的類和 Spring 容器中類是兩個類。

3、執行角度分析

現在我們把目光轉移,從測試執行的角度來分析。

面試官:說說 Springboot 中的 javaConfig(基於Spring5.2)

看到這裡,可能就要深入到Spring的原始碼中看了。Spring容器啟動時,ApplicationContext介面的實現類AnnotationConfigApplicationContext會執行refresh方法,往BeanFactory註冊bean就在此方法完成。我們看到這個refresh是核心。我們進入到這個原始碼中看看:

面試官:說說 Springboot 中的 javaConfig(基於Spring5.2)

我截取了其中一部分的原始碼,在裡面有一個方法很關鍵,那就是invokeBeanFactoryPostProcessors,意思是我們Spring容器首先會初始化BeanFactory,然後啟用各種beanFactory處理器,也就是執行invokeBeanFactoryPostProcessors,我們看看這個方法:

面試官:說說 Springboot 中的 javaConfig(基於Spring5.2)

在這個方法的內部的核心是ConfigurationClassPostProcessor,這個方法看到@Configuration,就會開啟類的載入,這裡也就是bean的載入。剩下的越挖越深,原始碼也越來越深。大體步驟我們可以總結一下:

ConfigurationClassPostProcessor處理器解析@configuration配置類主要過程:

(1)Spring容器初始化時註冊ConfigurationClassPostProcessor

(2)Spring容器初始化執行refresh()方法中呼叫ConfigurationClassPostProcessor

(3)ConfigurationClassPostProcessor處理器藉助ConfigurationClassParser完成配置類解析

(4)ConfigurationClassParser配置內解析過程中完成巢狀的MemberClass、@PropertySource註解、@ComponentScan註解(掃描package下的所有Class並進行迭代解析,主要是@Component元件解析及註冊)、@ImportResource、@Bean等處理

(5)接下來完成@Bean註冊, @ImportResource指定bean的註冊以及@Import的bean註冊

(6)有@Bean註解的方法在解析的時候作為ConfigurationClass的一個屬性,最後還是會轉換成BeanDefinition進行處理, 而例項化的時候會作為一個工廠方法進行Bean的建立

現在大致應該明白了,其實一句話說完,還是想辦法識別註解,完成和XML一樣的功能。

推薦文章

  • 蕭皇后真的那麼不堪嗎?別被影視劇騙了,她和楊廣不是那樣的

    ”之後隋就將蕭氏迎娶了回來,而這名嫁入晉王府的少女,看到儀表堂堂的晉王楊廣之後,二人也是一見傾心,後來還有了兩個可愛的孩子(都是男孩),而楊堅和獨孤皇后也是對這個兒媳十分滿意,在古代對於家族權力的繼承看得很重,所以能生男孩,自然是加分專案,...

  • 9月信用債交易覆盤:城投短久期成交上升

    二、城投債高於估值和短久期成交增加,貴州城投和部分“網紅”主體估值有所修復從城投債交易區域來看,9月份有成交債券超過1000只的省份共有11個,與8月份持平...

  • 看到最後才瞭解,為什麼好看的網紅小姐姐這麼多,生活中很少見到

    最後小編親眼所見終於明白為什麼短影片上面美女很多,但是生活中基本見不到了,主要還是美顏效果太逆天了,你看這位小姐姐正在利用美顏效果自拍,手機中的樣子和本人簡直差距太多了,所以不是現實中沒有網紅只是現實無法開美顏罷了但是話說回來,隨著科技的發...