Bean生命周期

Bean生命周期

IOC

整個(gè)都包含Bean生命周期內(nèi):
-> new AnnotationConfigApplicationContext(XXX); 掃描注解,beanDefinition
-> applicationContext.getBean() 創(chuàng)建Bean實(shí)例

生命周期大致順序

-> 生成BeanDefinition
-> 調(diào)用 BeanFactoryPostProcessor.postProcessBeanFactory
->  bean實(shí)例化
    -> 調(diào)用 AbstractAutowireCapableBeanFactory.doCreateBean
        -> createBeanInstance
            -> 調(diào)用構(gòu)造方法
-> populateBean屬性注入
    -> 調(diào)用set方法注入屬性
-> BeanPostProcessor.postProcessBeforeInitialization
-> bean初始化initializeBean
    -> afterPropertiesSet
    -> init-method
-> BeanPostProcessor.postProcessAfterInitialization

1.Bean實(shí)例化

在實(shí)例化之前會(huì)調(diào)用BeanFactoryPostProcessor的方法修改BeanDefinition
調(diào)用AbstractAutowireCapableBeanFactory.doCreateBean蟹瘾,createBeanInstance 實(shí)例化Bean

2.屬性注入

populateBean

3.Bean初始化

在調(diào)用Bean初始化之前會(huì)調(diào)用BeanPostProcessor postProcessBeforeInitialization

  • 1.實(shí)現(xiàn)InitializingBean
  • 2.實(shí)現(xiàn)afterPropertiesSet
  • 3.配置init-method
    在調(diào)用Bean初始化之后會(huì)調(diào)用BeanPostProcessor postProcessAfterInitialization

Q&A

1.BeanFactoryPostProcessor和BeanPostProcessor區(qū)別

這兩個(gè)接口實(shí)在是很像坡疼,但是作用以及場(chǎng)景不同

1.1.BeanFactoryPostProcessor

該接口中有一個(gè)方法:
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
實(shí)現(xiàn)BeanFactoryPostProcessor 接口 通過覆蓋postProcessBeanFactory方法,可以在bean實(shí)例化之前修改BeanDefinition

  • 在Spring的bean創(chuàng)建之前,修改bean的定義屬性种冬。
    Spring允許BeanFactoryPostProcessor在容器實(shí)例化任何其他Bean之前讀取配置元數(shù)據(jù)付燥,并可以根據(jù)需要進(jìn)行修改。
    BeanFactoryPostProcessor是在spring容器加載了bean的beanDefinition之后枝哄,在bean實(shí)例化之前執(zhí)行的肄梨。

  • 可以同時(shí)配置多個(gè)BeanFactoryPostProcessor,并通過order來控制執(zhí)行順序
    (eg:可以吧bean的scope從singleton改為prototype)

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
        throws BeansException {
    System.out
            .println("BeanFactoryPostProcessor調(diào)用postProcessBeanFactory方法");
    BeanDefinition bd = arg0.getBeanDefinition("person");
    bd.getPropertyValues().addPropertyValue("phone", "110");

}
1.1.1.常見的BeanFactoryPostProcessor實(shí)現(xiàn)類
  • org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
  • org.springframework.beans.factory.config.PropertyOverrideConfigurer
  • org.springframework.beans.factory.config.CustomEditorConfigurer

1.2.BeanPostProcessor

該接口有兩個(gè)方法:
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
這兩個(gè)方法挠锥,可以在spring容器實(shí)例化bean之后众羡,在執(zhí)行bean的初始化方法前后,添加一些自己的處理邏輯蓖租。
BeanPostProcessor是在spring容器加載了beanDefinition并且實(shí)例化bean之后執(zhí)行的粱侣。BeanPostProcessor的執(zhí)行順序是在BeanFactoryPostProcessor之后。

1.2.1.常見的BeanPostProcessor實(shí)現(xiàn)類
  • org.springframework.context.annotation.CommonAnnotationBeanPostProcessor:支持@Resource注解的注入
  • org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor:支持@Required注解的注入
  • org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor:支持@Autowired注解的注入
  • org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor:支持@PersistenceUnit和@PersistenceContext注解的注入
  • org.springframework.context.support.ApplicationContextAwareProcessor:用來為bean注入ApplicationContext等容器對(duì)象
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蓖宦,一起剝皮案震驚了整個(gè)濱河市齐婴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稠茂,老刑警劉巖柠偶,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異睬关,居然都是意外死亡诱担,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門电爹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔫仙,“玉大人,你說我怎么就攤上這事藐不≡群澹” “怎么了秦效?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涎嚼。 經(jīng)常有香客問我阱州,道長(zhǎng),這世上最難降的妖魔是什么法梯? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任苔货,我火速辦了婚禮,結(jié)果婚禮上立哑,老公的妹妹穿的比我還像新娘夜惭。我一直安慰自己,他們只是感情好铛绰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布诈茧。 她就那樣靜靜地躺著,像睡著了一般捂掰。 火紅的嫁衣襯著肌膚如雪敢会。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天这嚣,我揣著相機(jī)與錄音鸥昏,去河邊找鬼。 笑死姐帚,一個(gè)胖子當(dāng)著我的面吹牛吏垮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罐旗,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼膳汪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了尤莺?” 一聲冷哼從身側(cè)響起旅敷,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颤霎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涂滴,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡友酱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柔纵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缔杉。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖搁料,靈堂內(nèi)的尸體忽然破棺而出或详,到底是詐尸還是另有隱情系羞,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布霸琴,位于F島的核電站椒振,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梧乘。R本人自食惡果不足惜澎迎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望选调。 院中可真熱鬧夹供,春花似錦、人聲如沸仁堪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弦聂。三九已至鸟辅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間横浑,已是汗流浹背剔桨。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徙融,地道東北人洒缀。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像欺冀,于是被迫代替她去往敵國(guó)和親树绩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容