摘要:在中注入注入運(yùn)行結(jié)果注入使用注解正如其名在構(gòu)造器之后,即在銷(xiāo)毀之前。調(diào)用的方法構(gòu)造器注入屬性注入顧名思義,在這個(gè)方法里面可以拿到所有裝載的并在初始化之前對(duì)某些進(jìn)行修改。
先看一張圖:spring4.x 企業(yè)實(shí)戰(zhàn)
spring版本:4.3.17
1、bean自身的生命周期接口
1.1、實(shí)現(xiàn) InitializingBean、DisposableBean 接口
這2個(gè)接口,會(huì)要求你實(shí)現(xiàn)2個(gè)方法
@Component public class BeanSelf implements InitializingBean, DisposableBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet"); } @Override public void destroy() throws Exception { System.out.println("destroy"); } }
afterPropertieseSet 會(huì)在屬性設(shè)置完畢,調(diào)用,這里的屬性設(shè)置,指的是Bean的依賴(lài)注入。比如。在 BeanSelf中注入 BeanSelf2
private BeanSelf2 beanSelf2 @Autowired public void setBeanSelf2(BeanSelf2 beanSelf2) { System.out.println("注入BeanSelf2"); this.beanSelf2 = beanSelf2 }
運(yùn)行結(jié)果
注入 beanSelf2 afterPropertiesSet destroy
1.2、使用 @PostConstruct、 @PreDestroy 注解
正如其名:在構(gòu)造器之后, 即在銷(xiāo)毀之前。
public class BeanSelf implements InitializingBean, DisposableBean{ private BeanSelf2 beanSelf2; private BeanSelf3 beanSelf3; public BeanSelf(BeanSelf2 beanSelf2) { System.out.println("構(gòu)造器注入 beanSelf2"); this.beanSelf2 = beanSelf2; } @Autowired public void setBeanSelf3(BeanSelf3 beanSelf3) { System.out.println("屬性注入 beanSelf3"); this.beanSelf3 = beanSelf3; } @PostConstruct public void init() { System.out.println("PostConstruct"); } @PreDestroy public void initDestroy2() { System.out.println("PreDestroy"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet"); } @Override public void destroy() throws Exception { System.out.println("destroy"); } }
運(yùn)行效果
構(gòu)造器注入 beanSelf2 屬性注入 beanSelf3 PostConstruct --- 很明顯 @PostConstruct 是在構(gòu)造器之后注入 beanSelf2 afterPropertiesSet --- 在 PostConstruct 之后 PreDestroy --- 很明顯,是在銷(xiāo)毀之前調(diào)用的 destroy
小總結(jié):不管是@PostConstruct 或者 實(shí)現(xiàn)InitializingBean接口。 都是在Bean實(shí)例化完成之后才調(diào)用的。
2、beanFactory工廠接口,只調(diào)用一次
@Component public class MyBeanFactory implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { Iteratoriterator = configurableListableBeanFactory.getBeanNamesIterator(); BeanSelf2 beanSelf = (BeanSelf2) configurableListableBeanFactory.getBean("beanSelf2"); beanSelf.add(); System.out.println("beanFactoryPostProcessor"); } } @Component public class BeanSelf2 implements InitializingBean{ public void add() { System.out.println("add"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("beanSelf2 afterPropertiesSet"); } }
這個(gè)接口的方法會(huì)在實(shí)例化之前調(diào)用。 在postProcessBeanFactory 中,對(duì)BeanSelf2提前進(jìn)行初始化,并調(diào)用add方法。
beanSelf2 afterPropertiesSet -- 調(diào)用beanSelf2的afterPropertiesSet方法 add beanFactoryPostProcessor 構(gòu)造器注入 beanSelf2 屬性注入 beanSelf3 PostConstruct afterPropertiesSet PreDestroy
BeanFactoryPostProcessor 顧名思義,在這個(gè)方法里面可以拿到所有裝載的Bean,并在初始化之前對(duì)某些Bean進(jìn)行修改。(此時(shí)Bean還未初始化)
3、BeanPostProcessor接口在每個(gè)Bean實(shí)例之前,都會(huì)調(diào)用。如果Bean已實(shí)例化則不會(huì)diaoy
@Component public class MyBeanPostProcessor implements BeanPostProcessor{ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println(beanName +" = postProcessBeforeInitialization" ); if("beanSelf2".equals(beanName)) { return null; } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println(beanName +" = postProcessAfterInitialization"); return bean; } }
上面這段代碼的意思是,在初始化之前,將BeanSelf2 和 BeanSel3 置為null。但是,BeanSelf2不會(huì)走到這段代碼內(nèi),因?yàn)樵诮涌贐eanFactoryPostProcessor 中,將BeanSelf2提前初始化了。所以輸出結(jié)果如下
beanSelf2 afterPropertiesSet --- BeanFactoryPostProcessor中提前初始化 add --- 調(diào)用BeanSelf2的add方法 beanFactoryPostProcessor --- 在postProcessBeanFactory 中打印 beanConfig = postProcessBeforeInitialization --調(diào)用 BeanPostProcessor beanConfig = postProcessAfterInitialization --調(diào)用 BeanPostProcessor BeanSelf 構(gòu)造器注入 beanSelf2 --BeanSelf 構(gòu)造器注入屬性 beanSelf3 = postProcessBeforeInitialization -- 在實(shí)例化之前調(diào)用 BeanSelf 屬性注入 beanSelf3 -- 注入之前,BeanSelf3還沒(méi)實(shí)例化,所以在之前調(diào)用 BeanPostProcessor beanSelf = postProcessBeforeInitialization --- beanSelf 在屬性設(shè)置完畢后,即初始化完畢 調(diào)用 BeanPostProcessor#postProcessBeforeInitialization() BeanSelf PostConstruct -- 調(diào)用被 @PostConstruct 注解聲明的方法 afterPropertiesSet -- 調(diào)用 InitializingBean 接口實(shí)現(xiàn)的方法 beanSelf = postProcessAfterInitialization beanSelf2 com.xhn3.BeanSelf2@33cb5951 beanSelf3 null -- 在BeanPostProcessor中返回null。所以這邊是null BeanSelf PreDestroy destroy
小總結(jié):BeanPostProcessor#postProcessBeforeInitialization在init-method之前調(diào)用,在屬性設(shè)置完畢后調(diào)用。BeanPostProcessor#postProcessAfterInitialization 在InitializingBean#afterPropertiesSet后調(diào)用。
4、BeanDefinitionRegistryPostProcessor 注冊(cè)Bean的接口,在BeanFactoryPostProcesso前調(diào)用
@Component public class MyBeanRegister implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } }
在該方法里面可以直接注冊(cè)bean。可以提前實(shí)例化Bean
運(yùn)行流程:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69655.html
摘要:代碼示例自定義實(shí)現(xiàn)注冊(cè)運(yùn)行和預(yù)想一樣,輸出結(jié)果為,如果移除掉注解的屬性,輸出結(jié)果為總結(jié)在大多數(shù)情況下,我們應(yīng)該避免使用任何接口,除非我們需要它們。 showImg(https://segmentfault.com/img/remote/1460000019807821?w=1920&h=1080); 通過(guò)如下前序兩篇文章: Spring Bean 生命周期之我從哪里來(lái)? Spring...
摘要:目前建議使用與。入?yún)⑹钱?dāng)前正在處理的,是當(dāng)前的配置名,返回的對(duì)象為處理后的。如果,則將放入容器的緩存池中,并返回。和這兩個(gè)接口,一般稱(chēng)它們的實(shí)現(xiàn)類(lèi)為后處理器。體系結(jié)構(gòu)讓容器擁有了發(fā)布應(yīng)用上下文事件的功能,包括容器啟動(dòng)事件關(guān)閉事件等。 點(diǎn)擊進(jìn)入我的博客 1 如何理解IoC 1.1 依然是KFC的案例 interface Burger { int getPrice(); } in...
摘要:使用的好處知乎的回答不用自己組裝,拿來(lái)就用。統(tǒng)一配置,便于修改。 前言 只有光頭才能變強(qiáng) 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡(jiǎn)單啦 單例模式你會(huì)幾種寫(xiě)法? 工廠模式理解了沒(méi)有? 在刷Spring書(shū)籍的時(shí)候花了點(diǎn)時(shí)間去學(xué)習(xí)了單例模式和工廠模式,總的來(lái)說(shuō)還是非常值得的! 本來(lái)想的是刷完《Spring 實(shí)戰(zhàn) (第4版)》和《精通Spring4.x 企業(yè)應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)》...
摘要:除了,還簡(jiǎn)單介紹了對(duì)的支持,可以幫助應(yīng)用將散落在各處的邏輯匯集于一處切面。當(dāng)裝配的時(shí)候,這些切面能夠運(yùn)行期編織起來(lái),這樣就能呢個(gè)非常有效的賦予新功能。 第1章 Spring之旅 說(shuō)明 1、本文參考了《Spring 實(shí)戰(zhàn)》重點(diǎn)內(nèi)容,參考了GitHub上的代碼 2、每個(gè)人的學(xué)習(xí)方式不一樣,但目的是一樣的,活學(xué)活用。最近一直在聽(tīng)《我們不一樣》 3、本文只為記錄作為以后參考,要想真正領(lǐng)悟Sp...
摘要:上一篇文章生命周期之我從哪里來(lái)說(shuō)明了我是誰(shuí)和我從哪里來(lái)的兩大哲學(xué)問(wèn)題,今天我們要討論一下終極哲學(xué)我要到哪里去初始化有三種方式銷(xiāo)毀同樣有三種方式正所謂,天對(duì)地,雨對(duì)風(fēng)對(duì)對(duì)對(duì)雷隱隱,霧蒙蒙山花對(duì)海樹(shù),赤日對(duì)蒼穹平仄平仄平平仄,仄平仄平仄 上一篇文章 Spring Bean 生命周期之我從哪里來(lái) 說(shuō)明了我是誰(shuí)? 和 我從哪里來(lái)? 的兩大哲學(xué)問(wèn)題,今天我們要討論一下終極哲學(xué)我要到哪里去?sho...
閱讀 2610·2021-11-17 09:33
閱讀 3966·2021-10-19 11:46
閱讀 921·2021-10-14 09:42
閱讀 2266·2021-09-22 15:41
閱讀 4239·2021-09-22 15:20
閱讀 4648·2021-09-07 10:22
閱讀 2320·2021-09-04 16:40
閱讀 826·2019-08-30 15:52