成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

答讀者問(wèn):BeanFactoryPostProcessor 似乎失效了?

開(kāi)發(fā) 前端
經(jīng)過(guò)上面分析,小伙伴們可以看到,通過(guò) @Bean 注解定義的 Bean,我們?yōu)閷傩再x值是在方法內(nèi)部完成的,這些方法內(nèi)部的邏輯其實(shí)并未被解析到 BeanDefinition 中,顯然也沒(méi)有必要把方法內(nèi)部的邏輯解析到 BeanDefinition 上去,因此,通過(guò) @Bean 注解定義的 Bean,如果屬性中使用了占位符,是無(wú)法通過(guò) BeanFactoryPostProcessor 自動(dòng)解析的。

有小伙伴在學(xué)習(xí) Spring 源碼視頻的時(shí)候,看了松哥講的 BeanFactoryPostProcessor 的用法之后,提出了這樣一個(gè)問(wèn)題:

圖片圖片

圖片圖片

我來(lái)跟大家補(bǔ)充一下這個(gè)問(wèn)題的上下文:

我講了 BeanFactoryPostProcessor,分析了其原理,也講了具體的使用場(chǎng)景,一個(gè)典型的使用場(chǎng)景是我們?cè)?XML 中定義 Bean 的時(shí)候,如果 Bean 的屬性是使用了 properties 文件占位符如 ${db.username} 這種,那么在 BeanFactoryPostProcessor 階段,就會(huì)對(duì)這個(gè)占位符進(jìn)行處理,將其替換成真正的 value。然后我還順手給大家舉了一個(gè)例子,我在 XML 文件中定義 Bean 的時(shí)候,給 Bean 的某一個(gè)屬性設(shè)置 value 為 ^username,然后在 BeanFactoryPostProcessor 中,我將 ^username 改為某一個(gè)字符串。

小伙伴看了松哥講的內(nèi)容之后,也照著寫(xiě)了一個(gè),就是上面圖片中的代碼,不同的是,他是將 XML 配置改為了 Java 代碼配置,結(jié)果發(fā)現(xiàn)屬性 hok 并未變?yōu)?nbsp;NB,因此有了上述問(wèn)題。

我覺(jué)得這個(gè)問(wèn)題問(wèn)的很好,給了小伙伴們一個(gè)從其他方面理解 Spring 的機(jī)會(huì),這也是我前面一直強(qiáng)調(diào)的,這次的 Spring 視頻需要各位小伙伴一起發(fā)力,大家有關(guān)于 Spring 的任何問(wèn)題都可以提,我負(fù)責(zé)通過(guò)源碼來(lái)回答你。

問(wèn)題分析

這個(gè)問(wèn)題的分析,得先從 BeanDefinition 開(kāi)始。在講 BeanFactoryPostProcessor 之前,松哥已經(jīng)和小伙伴們分析過(guò) BeanDefinition 了,無(wú)論我們是通過(guò) Java 代碼還是通過(guò) XML 文件定義的 Bean 對(duì)象,在解析稱為 Bean 對(duì)象之前,得先解析成為 BeanDefinition,BeanDefinition 則有不同的分類,對(duì)于 XML 文件定義的 Bean,最終解析為 GenericBeanDefinition,而通過(guò) @Bean 注解定義的 Bean 則解析為 ConfigurationClassBeanDefinition。

但是這兩個(gè)的處理原理顯然是有差異的。

對(duì)于 XML 定義的 Bean 來(lái)說(shuō),很明顯 XML 中的所有屬性都要先解析到 BeanDefinition 中,包括我們?cè)?XML 中配置的 Bean 的各種屬性,這一步是在 Spring 容器 refresh 方法中構(gòu)建 BeanFactory 的時(shí)候完成的(obtainFreshBeanFactory 方法),這一步完成之后,在后面的步驟會(huì)去執(zhí)行容器中所有的 BeanFactoryPostProcessor(invokeBeanFactoryPostProcessors),此時(shí)就會(huì)把前面解析出來(lái)的 BeanDefinition 中帶有占位符的屬性給替換過(guò)來(lái),最后在 refresh 方法中執(zhí)行 finishBeanFactoryInitialization 方法完成 Bean 的初始化。

按照上面這一套流程順序,占位符被解析成為正常字符串沒(méi)什么問(wèn)題。

但是,如果是 @Bean 注解配置的 Bean,則會(huì)有所差異。

首先,@Bean 注解所標(biāo)記的方法要被解析為一個(gè) ConfigurationClassBeanDefinition,這個(gè)過(guò)程本身是通過(guò) ConfigurationClassPostProcessor 來(lái)完成的,而 ConfigurationClassPostProcessor 本質(zhì)上其實(shí)就是一個(gè) BeanFactoryPostProcessor,換言之,@Bean 注解標(biāo)記的方法是在 BeanFactoryPostProcessor 中被解析為 ConfigurationClassBeanDefinition 的。ConfigurationClassBeanDefinition 這個(gè) BeanDefinition 主要用來(lái)記錄 @Bean 注解所標(biāo)記的方法所屬的對(duì)象、方法的名稱、方法對(duì)象、方法參數(shù)、注解的參數(shù)等等信息,把這些信息記錄下來(lái),將來(lái)在初始化 Bean 的時(shí)候,通過(guò)反射執(zhí)行目標(biāo)方法就可以了,即方法里邊的內(nèi)容是什么,ConfigurationClassBeanDefinition 其實(shí)并不關(guān)心。

最后則是和 XML 一樣,在 finishBeanFactoryInitialization 方法中完成 Bean 的初始化。

經(jīng)過(guò)上面分析,小伙伴們可以看到,通過(guò) @Bean 注解定義的 Bean,我們?yōu)閷傩再x值是在方法內(nèi)部完成的,這些方法內(nèi)部的邏輯其實(shí)并未被解析到 BeanDefinition 中,顯然也沒(méi)有必要把方法內(nèi)部的邏輯解析到 BeanDefinition 上去,因此,通過(guò) @Bean 注解定義的 Bean,如果屬性中使用了占位符,是無(wú)法通過(guò) BeanFactoryPostProcessor 自動(dòng)解析的。

好啦,現(xiàn)在小伙伴提出的問(wèn)題大家伙都明白了吧?

責(zé)任編輯:武曉燕 來(lái)源: 江南一點(diǎn)雨
相關(guān)推薦

2012-02-24 10:28:32

2022-04-01 08:37:07

SpringAPI前端

2010-05-28 15:47:16

雙絞線

2012-10-31 09:41:47

WAN優(yōu)化SSLHTTPS

2014-12-15 11:16:34

vCenter SRM

2023-06-05 08:15:30

MySQLInnoDB

2011-11-03 09:29:32

2011-08-05 11:06:33

VMware vSph虛擬化

2016-12-12 14:55:01

AndroidAndroid Vie

2011-12-08 09:47:08

虛擬化應(yīng)用虛擬化

2011-03-14 14:40:28

VMware Work

2009-12-02 15:02:17

路由器怎么安裝

2025-04-23 08:10:00

2013-02-18 09:22:48

虛擬化KVM

2024-08-07 13:40:00

2011-09-21 09:26:31

虛擬化虛擬測(cè)試開(kāi)發(fā)環(huán)境

2013-02-26 14:03:47

VMware WorkWindows 8

2011-10-10 09:45:34

網(wǎng)絡(luò)虛擬化虛擬化

2021-06-01 10:49:22

線程池Java開(kāi)發(fā)

2021-06-03 14:23:57

線程線程池JAVA
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: a级片网站 | 激情五月婷婷综合 | 在线看91 | 成人av一区 | 欧洲视频一区二区 | 中文字幕在线剧情 | 8x国产精品视频一区二区 | 中国黄色在线视频 | 亚洲国产精品网站 | 国产成人午夜精品影院游乐网 | 欧美视频xxx | 一区二区三区四区在线播放 | 综合二区| 日韩欧美在线一区 | jizz在线免费观看 | 97视频成人 | 久久久久久久久久久久91 | 中文在线a在线 | 久久99网| 99视频在线免费观看 | 黄色一级大片在线免费看产 | 午夜免费成人 | 国产不卡在线 | 九九亚洲 | 天堂成人国产精品一区 | 福利网站在线观看 | 日韩在线免费视频 | 日韩欧美国产精品 | 国产精品国产三级国产播12软件 | 欧美日韩视频 | 美女福利视频 | 一级免费视频 | 国产精品久久久久久久免费大片 | 综合第一页 | 国产精品免费在线 | а_天堂中文最新版地址 | 围产精品久久久久久久 | 国产综合网站 | 欧美日韩国产综合在线 | 久久久精品视 | 可以在线看的黄色网址 |