摘要:的在單例被破壞時(shí)由進(jìn)行方法調(diào)用。定義并實(shí)現(xiàn)這兩個(gè)接口容器創(chuàng)建完成注解是的縮寫,意思是規(guī)范提案。在創(chuàng)建完成并且屬性賦值完成來執(zhí)行初始化方法在容器銷毀之前回調(diào)通知支持自動(dòng)裝配,類似。
Spring注解應(yīng)用篇--IOC容器Bean生命周期
這是Spring注解專題系類文章,本系類文章適合Spring入門者或者原理入門者,小編會(huì)在本系類文章下進(jìn)行企業(yè)級(jí)應(yīng)用實(shí)戰(zhàn)講解以及spring源碼跟進(jìn)。環(huán)境準(zhǔn)備
本文來自公眾號(hào):B一下爪哇
編譯器IDEA
maven依賴spring-context version:4.3.12.RELEASE
maven依賴junit version:4.11
Bean注解來指定bean初始化和銷毀方法前面一章提過,在配置類中通過@Bean來將組件注入到容器中,在容器中,Bean的生命周期大抵上可以分為創(chuàng)建--初始化--銷毀的過程,容器管理著組件的全部生命周期。Bean注解源碼里面包含initMethod和destroyMethod兩個(gè)屬性,可以分別來自定義bean的初始化方法和銷毀方法。
自定義格式:
@Bean(initMethod=,destoryMethod=)
測(cè)試:
先在Bean中自定義初始化和銷毀方法:
public class ExampleBean { private String name; private int age; ..... public void init(){ System.out.println("ExampleB init..."); } public void destory(){ System.out.println("Example destory..."); } }
配置類:
@Configuration public class BaseConfig { @Bean(value="beanIdDefinition",initMethod = "init",destroyMethod = "destory") public ExampleBean exampleBean(){ return new ExampleBean(); } }
測(cè)試類:
@Test public void shouldAnswerWithTrue() { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BaseConfig.class); System.out.println("IOC容器創(chuàng)建完成..."); String[] beanDefinitionNames = ctx.getBeanDefinitionNames(); ctx.close(); }
output:
exampleBean constructor...... ExampleB init... IOC容器創(chuàng)建完成... Example destory...
由此可知,在容器初始化過程中已經(jīng)完成對(duì)bean的初始化工作,并且在容器關(guān)閉途中,調(diào)用bean的銷毀方法。(下一章分析容器初始化大致做了哪一些工作)
InitializingBean和DisposableBean接口指定Bean初始化和銷毀方法InitializingBean的afterPropertiesSet在設(shè)置提供Bean的屬性值后由BeanFactory調(diào)用進(jìn)行方法調(diào)用。
DisposableBean的destory在Bean單例被破壞時(shí)由BeanFactory進(jìn)行方法調(diào)用。
定義Bean并實(shí)現(xiàn)這兩個(gè)接口
public class LifeCycleBean implements InitializingBean, DisposableBean{ @Override public void afterPropertiesSet() throws Exception { System.out.println("LifeCycleBean afterPropertieSet...."); } @Override public void destroy() throws Exception { System.out.println("LifeCycleBean destory...."); } }
output:
LifeCycleBean afterPropertieSet.... IOC容器創(chuàng)建完成... LifeCycleBean destory....PostConstruct & PreDestory注解
JSR是Java Specification Requests的縮寫,意思是Java 規(guī)范提案。
JSR250已經(jīng)添加至Java SE6中,常用的大概就是PostConstruct初始化、PreDestory銷毀、Resource資源等。
Spring支持JSR250的注解。PostConstruct在bean創(chuàng)建完成并且屬性賦值完成;來執(zhí)行初始化方法;PreDestory在容器銷毀bean之前回調(diào)通知;Resource支持bean自動(dòng)裝配,類似Autowired。
使用方式,在Bean中直接添加:
@PostConstruct public void initPost(){ System.out.println("ExampleBean JSR250 PostConstruct..."); } @PreDestroy public void destoryPre(){ System.out.println("ExampleBean JSR250 PreDestory..."); }
測(cè)試output:
exampleBean constructor...... ExampleBean JSR250 PostConstruct... IOC容器創(chuàng)建完成... ExampleBean JSR250 PreDestory...BeanPostProcessor后置處理器
BeanPostProcessor【接口】:bean后置處理器在Bean的生命周期起到一個(gè)承上啟下的作用,在Bean初始化前后進(jìn)行處理工作。
PostProcessorBeforeInitialization方法:在初始化方法調(diào)用之前調(diào)用;
postProcessorBefore方法:在bean初始化方法調(diào)用之后工作
兩個(gè)方法都包含2個(gè)相同的參數(shù):
@param Object o:Bean實(shí)例
@param String s:beanName
定義一個(gè)Bean實(shí)現(xiàn)后置處理器接口:
public class BeanPostProcessorDefinition implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { System.out.println("postProcessBeforeInitialization -->"+s+" = "+o); return o; } @Override public Object postProcessAfterInitialization(Object o, String s) throws BeansException { System.out.println("postProcessorAfterInitialization -->"+s+"="+o); return o; } }
以容器中存在的id為exampleBean的bean為例:查看output:
//部分容器初始化的一些bean exampleBean constructor...... postProcessBeforeInitialization -->exampleBean = ExampleBean{name="null", age=0} ExampleBean JSR250 PostConstruct... postProcessorAfterInitialization -->exampleBean=ExampleBean{name="null", age=0} IOC容器創(chuàng)建完成...
由此不難得出,在容器初始化過程中,大致依次完成bean的創(chuàng)建,實(shí)例化,屬性賦值,執(zhí)行bean后置處理器初始化之前的方法,執(zhí)行初始化方法,執(zhí)行bean后置處理器初始化之后的方法。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/74626.html
摘要:用法先創(chuàng)建個(gè)組件,,,分別在類上加上注解。發(fā)現(xiàn)有一個(gè)屬性源碼注釋這樣說的自動(dòng)檢測(cè)使用組件。在的方法中,表示不匹配,代表匹配。這就說明使用注冊(cè)組件有種方式。 Spring注解應(yīng)用篇--IOC容器Bean組件注冊(cè) 這是Spring注解專題系類文章,本系類文章適合Spring入門者或者原理入門者,小編會(huì)在本系類文章下進(jìn)行企業(yè)級(jí)應(yīng)用實(shí)戰(zhàn)講解以及spring源碼跟進(jìn)。 環(huán)境準(zhǔn)備 編譯器IDEA...
摘要:那么為什么可以帶給我們這樣的完美編碼體驗(yàn)?zāi)貙?shí)際上,這完全歸功于的封裝,由于在服務(wù)注冊(cè)與發(fā)現(xiàn)客戶端負(fù)載均衡等方面都做了很好的抽象,而上層應(yīng)用方面依賴的都是這些抽象接口,而非針對(duì)某個(gè)具體中間件的實(shí)現(xiàn)。 通過《Spring Cloud Alibaba基礎(chǔ)教程:使用Nacos實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)》一文的學(xué)習(xí),我們已經(jīng)學(xué)會(huì)如何使用Nacos來實(shí)現(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn),同時(shí)也介紹如何通過LoadBala...
摘要:響應(yīng)式編程是基于異步和事件驅(qū)動(dòng)的非阻塞程序,只是垂直通過在內(nèi)啟動(dòng)少量線程擴(kuò)展,而不是水平通過集群擴(kuò)展。三特性常用的生產(chǎn)的特性如下響應(yīng)式編程模型適用性內(nèi)嵌容器組件還有對(duì)日志消息測(cè)試及擴(kuò)展等支持。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 02:WebFlux 快速入門實(shí)踐 文章工程: JDK...
摘要:靈活性和針對(duì)性。所以我覺得大部分組件還是自己封裝來的更為方便和靈活一些。動(dòng)手開干接下來我們一起手摸手教改造包裝一個(gè)插件,只要幾分鐘就可以封裝一個(gè)專屬于你的。 項(xiàng)目地址:vue-countTo配套完整后臺(tái)demo地址:vue-element-admin系類文章一:手摸手,帶你用vue擼后臺(tái) 系列一(基礎(chǔ)篇)系類文章二:手摸手,帶你用vue擼后臺(tái) 系列二(登錄權(quán)限篇)系類文章三:手摸手,帶...
閱讀 1948·2021-11-24 10:45
閱讀 1451·2021-11-18 13:15
閱讀 4524·2021-09-22 15:47
閱讀 3901·2021-09-09 11:36
閱讀 2005·2019-08-30 15:44
閱讀 3080·2019-08-29 13:05
閱讀 2495·2019-08-29 12:54
閱讀 1985·2019-08-26 13:47