您好,登錄后才能下訂單哦!
這篇文章主要講解了“spring注解配置bean的初始化和銷毀方法是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“spring注解配置bean的初始化和銷毀方法是什么”吧!
當spring完成bean的屬性賦值之后,就會執行bean的初始化方法,而當spring要銷毀bean實例的時候,也會調用bean的銷毀方法。我們可以在初始化方法中做一些資源加載的操作,比如緩存數據到redis。而在銷毀方法中,可以做一些資源釋放的操作,比如刪除redis緩存數據、釋放數據庫連接等。由于我們現在很少寫spring的xml文件,所以這次就講解通過注解的方式來指定bean的初始化方法和銷毀方法。我們先定義如下的配置類、業務服務類和單元測試方法,供后面測試使用。
package com.xk.spring.init; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** 測試初始化方法和銷毀方法 * * @author xk * @since 2023.04.30 15:31 */ @Configuration public class InitConfig { @Bean public RedisService redisService(){ return new RedisService(); } }
package com.xk.spring.init; /** * 用于如何配置講解bean的初始化方法 * @author xk * @since 2023.04.30 15:26 */ public class RedisService{ public RedisService(){ System.out.println("這是RedisService構造方法"); } }
單元測試方法如下:
@Test public void testInitAndDestroyConfig(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(InitConfig.class); applicationContext.close(); }
我們在配置類中使用@Bean注解生成bean實例的時候,可以使用@Bean注解的initMethod屬性指定初始化方法,initMethod的值是目標bean對應的類中的方法名,當spring完成bean的屬性賦值之后,就會執行initMethod對應的這個方法。
修改RedisService服務類內容如下,增加自定義的initMethod方法:
package com.xk.spring.init; /** * 用于如何配置講解bean的初始化方法 * @author xk * @since 2023.04.30 15:26 */ public class RedisService { public RedisService(){ System.out.println("這是RedisService構造方法"); } public void initMethod(){ System.out.println("(1)這是一個@Bean initMethod初始化方法"); } }
修改InitConfig配置類如下,指定@Bean注解的initMethod屬性值為RedisService類中的initMethod方法:
package com.xk.spring.init; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** 測試初始化方法和銷毀方法 * * @author xk * @since 2023.04.30 15:31 */ @Configuration public class InitConfig { @Bean(initMethod = "initMethod") public RedisService redisService(){ return new RedisService(); } }
最后執行testInitAndDestroyConfig單元測試方法,得出如下結果:
這是RedisService構造方法 (1)這是一個@Bean initMethod初始化方法
@PostConstruct注解用于在bean完成依賴注入(屬性賦值)之后需要執行的方法上,它是被用在bean對應的類中定義的方法,而且一個類中只能有一個方法被標記@PostConstruct注解。只要方法所屬的類不是攔截器類而且方法本身無參且沒有返回值,那就可以在這個方法上面使用@PostConstruct注解。(如果方法所屬類的是攔截器類,在滿足一定的要求時也可以使用@PostConstruct注解,但這種情況很少使用,所以此處先不提。)我們保持InitConfig類不變,修改RedisService類內容如下:
package com.xk.spring.init; import javax.annotation.PostConstruct; /** * 用于如何配置講解bean的初始化方法 * @author xk * @since 2023.04.30 15:26 */ public class RedisService{ public RedisService(){ System.out.println("這是RedisService構造方法"); } public void initMethod(){ System.out.println("(1)這是一個@Bean initMethod初始化方法"); } @PostConstruct private void initMethod2(){ System.out.println("(2)這是一個@PostConstruct初始化方法"); } }
最后執行testInitAndDestroyConfig單元測試方法,得出如下結果:
這是RedisService構造方法 (2)這是一個@PostConstruct初始化方法 (1)這是一個@Bean initMethod初始化方法
可以看出,標記@PostConstruct注解的方法要比@Bean注解的InitMethod屬性指定的方法先執行。
InitializingBean接口只有一個afterPropertiesSet方法,假如一個bean完成了屬性賦值,并且這個bean對應的類實現了該接口,spring就會調用afterPropertiesSet方法。我們繼續在前兩步的基礎上進行修改,保持InitConfig類不變,修改RedisService類如下:
package com.xk.spring.init; import org.springframework.beans.factory.InitializingBean; import javax.annotation.PostConstruct; /** * 用于如何配置講解bean的初始化方法 * @author xk * @since 2023.04.30 15:26 */ public class RedisService implements InitializingBean { public RedisService(){ System.out.println("這是RedisService構造方法"); } public void initMethod(){ System.out.println("(1)這是一個@Bean initMethod初始化方法"); } @PostConstruct private void initMethod2(){ System.out.println("(2)這是一個@PostConstruct初始化方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("(3)這是一個InitializingBean初始化方法"); } }
最后執行單元測試,得出結果如下:
這是RedisService構造方法 (2)這是一個@PostConstruct初始化方法 (3)這是一個InitializingBean初始化方法 (1)這是一個@Bean initMethod初始化方法
bean的初始化方法調用位于bean的屬性賦值之后,我們可以同時使用以上三種方式來指定bean的初始化方法,而且執行順序如下:
@PostConstruct指定的方法-->InitializingBean接口的afterPropertiesSet方法-->@Bean的initMethod屬性指定的方法
我們在配置類中使用@Bean注解生成bean實例的時候,可以使用@Bean注解的destroyMethod屬性指定bean的銷毀方法,destroyMethod的值是目標bean對應的類中的方法名,當spring完成bean的屬性賦值之后,就會執行destroyMethod對應的這個方法。
我們修改RedisService服務類內容如下,增加自定義的destroyMethod方法:
package com.xk.spring.init; import org.springframework.beans.factory.InitializingBean; import javax.annotation.PostConstruct; /** * 用于如何配置講解bean的初始化方法 * @author xk * @since 2023.04.30 15:26 */ public class RedisService implements InitializingBean { public RedisService(){ System.out.println("這是RedisService構造方法"); } public void initMethod(){ System.out.println("(1)這是一個@Bean initMethod初始化方法"); } @PostConstruct private void initMethod2(){ System.out.println("(2)這是一個@PostConstruct初始化方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("(3)這是一個InitializingBean初始化方法"); } public void destroyMethod(){ System.out.println("(1)這是一個@Bean destroyMethod銷毀方法"); } }
修改InitConfig配置類如下,指定@Bean注解的destroyMethod屬性值為RedisService類中的destroyMethod方法:
package com.xk.spring.init; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** 測試初始化方法和銷毀方法 * * @author xk * @since 2023.04.30 15:31 */ @Configuration public class InitConfig { @Bean(initMethod = "initMethod",destroyMethod = "destroyMethod") public RedisService redisService(){ return new RedisService(); } }
最后執行testInitAndDestroyConfig單元測試方法,得出如下結果:
這是RedisService構造方法 (2)這是一個@PostConstruct初始化方法 (3)這是一個InitializingBean初始化方法 (1)這是一個@Bean initMethod初始化方法 (1)這是一個@Bean destroyMethod銷毀方法
@PreDestroy注解用于在bean被銷毀時需要執行的方法上,它是被用在bean對應的類中定義的方法,而且一個類中只能有一個方法被標記@PreDestroy注解。只要方法所屬的類不是攔截器類而且方法本身無參且沒有返回值,那就可以在這個方法上面使用@PreDestroy注解。(如果方法所屬類的是攔截器類,在滿足一定的要求時也可以使用@PreDestroyt注解,但這種情況很少使用,所以此處先不提。)我們保持InitConfig類不變,修改RedisService類內容如下:
package com.xk.spring.init; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; /** * 用于如何配置講解bean的初始化方法 * @author xk * @since 2023.04.30 15:26 */ public class RedisService implements InitializingBean, DisposableBean { public RedisService(){ System.out.println("這是RedisService構造方法"); } public void initMethod(){ System.out.println("(1)這是一個@Bean initMethod初始化方法"); } @PostConstruct private void initMethod2(){ System.out.println("(2)這是一個@PostConstruct初始化方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("(3)這是一個InitializingBean初始化方法"); } public void destroyMethod(){ System.out.println("(1)這是一個@Bean destroyMethod銷毀方法"); } @PreDestroy public void destroyMethod2() { System.out.println("(2)這是一個@PreDestroy銷毀方法"); } }
最后執行testInitAndDestroyConfig單元測試方法,得出如下結果:
這是RedisService構造方法 (2)這是一個@PostConstruct初始化方法 (3)這是一個InitializingBean初始化方法 (1)這是一個@Bean initMethod初始化方法 (2)這是一個@PreDestroy銷毀方法 (1)這是一個@Bean destroyMethod銷毀方法
可以看出,標記@PreDestroy注解的方法要比@Bean注解的destroyMethod屬性指定的方法先執行。
DisposableBean接口只有一個destroy方法,假如一個bean對應的類實現了該接口,spring在bean(或容器)銷毀時就會調用destroy方法。我們繼續在前面代碼的基礎上進行修改,保持InitConfig類不變,修改RedisService類如下:
package com.xk.spring.init; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; /** * 用于如何配置講解bean的初始化方法 * @author xk * @since 2023.04.30 15:26 */ public class RedisService implements InitializingBean, DisposableBean { public RedisService(){ System.out.println("這是RedisService構造方法"); } public void initMethod(){ System.out.println("(1)這是一個@Bean initMethod初始化方法"); } @PostConstruct private void initMethod2(){ System.out.println("(2)這是一個@PostConstruct初始化方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("(3)這是一個InitializingBean初始化方法"); } public void destroyMethod(){ System.out.println("(1)這是一個@Bean destroyMethod銷毀方法"); } @PreDestroy public void destroyMethod2() { System.out.println("(2)這是一個@PreDestroy銷毀方法"); } @Override public void destroy() throws Exception { System.out.println("(3)這是一個DisposableBean銷毀方法"); } }
最后執行單元測試,得出結果如下:
這是RedisService構造方法 (2)這是一個@PostConstruct初始化方法 (3)這是一個InitializingBean初始化方法 (1)這是一個@Bean initMethod初始化方法 (2)這是一個@PreDestroy銷毀方法 (3)這是一個DisposableBean銷毀方法 (1)這是一個@Bean destroyMethod銷毀方法
感謝各位的閱讀,以上就是“spring注解配置bean的初始化和銷毀方法是什么”的內容了,經過本文的學習后,相信大家對spring注解配置bean的初始化和銷毀方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。