您好,登錄后才能下訂單哦!
今天小編給大家分享一下Spring中Bean初始化和銷毀的方法是什么的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Spring中支持在Bean的加載時聲明初始化方法,該方法會在Bean對象完成初始化之前進(jìn)行執(zhí)行,可以為對象指定一些特定的行為,同樣的Bean銷毀時,也是支持這個動作的。其中因為對象的作用域不同,銷毀的表現(xiàn)形式略有區(qū)別。初始化都沒有區(qū)別,無論是單例、原型、request、session、global session等他們的創(chuàng)建時初始化都沒啥區(qū)別,但是銷毀會略有區(qū)別,單例模式默認(rèn)不會銷毀,只有在Spring容器被銷毀時才會執(zhí)行Bean的銷毀,從而執(zhí)行他的銷毀方法。session、request等他們是作用范圍到了就會被銷毀,并不會長期存在,所以他們的銷毀方法是在作用范圍執(zhí)行之后來調(diào)用的。
Spring中總共支持了三種方式對Bean進(jìn)行初始化,依次是在方法上使用PostConstruct注解、實現(xiàn)InitializtingBean接口重寫對應(yīng)方法、聲明init-method方法來實現(xiàn),且他們?nèi)齻€支持并行。也就是說我們可以三個都是用,當(dāng)三個都是用時就是按照下面的順序執(zhí)行的,即限制性PostConstruct注解的方法,再執(zhí)行InitializingBean的方法,最終執(zhí)行init-method的方法。
如下所示,這里使用配置類的方式進(jìn)行注入,因為一會延時init-method必須使用配置類才可以實現(xiàn),啟動容器當(dāng)加載TestA這個Bean時,他的初始化方法就會被執(zhí)行。
@Configuration public class TestInitmestond { @Bean public TestA getBeanA(){ return new TestA(); } } class TestA{ @PostConstruct public void postConstructor(){ System.out.println("這是使用了PostConstruct注解的初始化方法"); } }
下面是結(jié)合了第一種和第二種的初始化方式:
@Configuration public class TestInitmestond { @Bean public TestA getBeanA(){ return new TestA(); } } class TestA implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("這是實現(xiàn)InitializingBean的初始化方法"); } @PostConstruct public void postConstructor(){ System.out.println("這是使用了PostConstruct注解的初始化方法"); } }
init-method方法必須使用配置類進(jìn)行加載Bean才可以配置,因為該屬性是Bean標(biāo)簽的屬性,在注解中也就是Bean注解的屬性,所以我們使用Component等其他IOC注解時是無法指定的。
@Configuration public class TestInitmestond { @Bean(initMethod = "initMethod") public TestA getBeanA(){ return new TestA(); } } class TestA implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("這是實現(xiàn)InitializingBean的初始化方法"); } @PostConstruct public void postConstructor(){ System.out.println("這是使用了PostConstruct注解的初始化方法"); } public void initMethod(){ System.out.println("這是使用了init-method聲明的初始化方法"); } }
下面啟動下容器展示下他們的執(zhí)行順序,如下:
可以看到他們的順序是固定的即:PostConstruct—>initializingBean—>init-method.
同樣的Spring也支持了三種銷毀的方式,且這三種銷毀方式與三種創(chuàng)建方式是完全對應(yīng)的。同時與初始化方法一樣Spring也是支持三種銷毀方法的并行的。且他們并行時順序是固定的:執(zhí)行PreDestroy–>DisposableBean–>destroy-method.
這里容器采用手動啟動的方式進(jìn)行創(chuàng)建,然后為容器設(shè)置一個銷毀的鉤子,這樣當(dāng)容器銷毀時我們就可以去執(zhí)行銷毀方法了,對于單例模式的銷毀方法只能通過這種測試了,若是我們直接停止IDEA的服務(wù)是不會執(zhí)行銷毀方法的。不過對于scope不是singleton的Bean來說,比如request在正常服務(wù)里是可以體現(xiàn)銷毀動作的。
public class TestDestroyMethod { //手動啟動容器,模擬關(guān)閉 public static void main(String[] args) { AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(TestConfig.class); annotationConfigApplicationContext.start(); annotationConfigApplicationContext.registerShutdownHook(); } } @Configuration class TestConfig{ @Bean public TestB getBean(){ return new TestB(); } } class TestB{ @PreDestroy public void preDestroy(){ System.out.println("這是使用PreDestroy注解的銷毀方法"); } }
這種就是直接實現(xiàn)接口重寫destroy方法即可
public class TestDestroyMethod { //手動啟動容器,模擬關(guān)閉 public static void main(String[] args) { AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(TestConfig.class); annotationConfigApplicationContext.start(); annotationConfigApplicationContext.registerShutdownHook(); } } @Configuration class TestConfig{ @Bean public TestB getBean(){ return new TestB(); } } class TestB implements DisposableBean { @PreDestroy public void preDestroy(){ System.out.println("這是使用PreDestroy注解的銷毀方法"); } @Override public void destroy() throws Exception { System.out.println("這是實現(xiàn)DisposableBean的方法"); } }
下面是結(jié)合了三種銷毀方法的代碼
public class TestDestroyMethod { //手動啟動容器,模擬關(guān)閉 public static void main(String[] args) { AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(TestConfig.class); annotationConfigApplicationContext.start(); annotationConfigApplicationContext.registerShutdownHook(); } } @Configuration class TestConfig{ @Bean(destroyMethod = "destroyMethod") public TestB getBean(){ return new TestB(); } } class TestB implements DisposableBean { @PreDestroy public void preDestroy(){ System.out.println("這是使用PreDestroy注解的銷毀方法"); } @Override public void destroy() throws Exception { System.out.println("這是實現(xiàn)DisposableBean的方法"); } public void destroyMethod(){ System.out.println("這是制定了destroy-method的銷毀方法"); } }
下面是執(zhí)行的截圖,可以看到三種銷毀方式與初始化方式一樣都是有固定順序的,事實上初始化方式與銷毀方式他們是有對應(yīng)關(guān)系的。PostConstruct與PreDestroy是一組,InitializingBean與DisposableBean是一組,init-method與destroy-method是一組。
以上就是“Spring中Bean初始化和銷毀的方法是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。