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