Java Spring Bean的生命周期管理詳解
Spring Bean的生命周期管理
一、Spring Bean的生命周期
通過以下方式來指定Bean的初始化和銷毀方法, 當(dāng)Bean為單例時(shí),Bean歸Spring容器管理,Spring容器關(guān)閉,就會(huì)調(diào)用Bean的銷毀方法 當(dāng)Bean為多例時(shí),Bean不歸Spring容器管理,Spring容器關(guān)閉,不會(huì)調(diào)用Bean的銷毀方法
二、通過@Bean的參數(shù)(initMethod ,destroyMethod)指定Bean的初始化和銷毀方法
1、項(xiàng)目結(jié)構(gòu)
2、Person
public class Person { public Person(){ System.out.println("Person 創(chuàng)建了..."); } public void init(){ System.out.println("Person 初始化了..."); } public void destroy(){ System.out.println("Person 被銷毀了..."); } }
3、Bean注冊(cè)配置類(單實(shí)例)
import com.dashu.bean.Person; import org.springframework.context.annotation.*; @Configuration public class BeanConfig { @Bean(initMethod = "init",destroyMethod = "destroy") public Person person(){ return new Person(); } }
4、測(cè)試類
import com.dashu.bean.Person; import com.dashu.config.BeanConfig; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { //加載配置類獲取容器 AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(BeanConfig.class); //獲取Bean Person bean = annotationConfigApplicationContext.getBean(Person.class); //關(guān)閉容器 annotationConfigApplicationContext.close(); } }
5、測(cè)試結(jié)果
6、Bean注冊(cè)配置類(多實(shí)例)
import com.dashu.bean.Person; import org.springframework.context.annotation.*; @Configuration public class BeanConfig { @Scope("prototype") @Bean(initMethod = "init",destroyMethod = "destroy") public Person person(){ return new Person(); } }
7、測(cè)試結(jié)果
三、Bean實(shí)現(xiàn)接口InitializingBean, DisposableBean
1、Person
import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class Person implements InitializingBean, DisposableBean { public Person(){ System.out.println("Person 創(chuàng)建了..."); } @Override public void afterPropertiesSet() throws Exception { System.out.println("Person 初始化了..."); } @Override public void destroy() throws Exception { System.out.println("Person 被銷毀了..."); } }
2、Bean注冊(cè)配置類
import com.dashu.bean.Person; import org.springframework.context.annotation.*; @Configuration public class BeanConfig { @Bean public Person person(){ return new Person(); } }
3、測(cè)試結(jié)果
四、通過注解@PostConstruct和@PreDestroy
@PostConstruct:標(biāo)注在Bean的初始化方法上 @PreDestroy:標(biāo)注在Bean的銷毀方法上
1、Person
import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class Person { public Person(){ System.out.println("Person 創(chuàng)建了..."); } @PostConstruct public void init(){ System.out.println("Person 初始化了..."); } @PreDestroy public void destroy(){ System.out.println("Person 被銷毀了..."); } }
2、測(cè)試結(jié)果
五、使用接口BeanPostProcessor實(shí)現(xiàn)類(后置處理器)
1、項(xiàng)目結(jié)構(gòu)
2、Person
import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @Component public class Person { public Person(){ System.out.println("Person 創(chuàng)建了..."); } @PostConstruct public void init(){ System.out.println("Person 初始化了..."); } @PreDestroy public void destroy(){ System.out.println("Person 被銷毀了..."); } }
3、Bean注冊(cè)配置類
import org.springframework.context.annotation.*; @Configuration @ComponentScan({"com.dashu"}) public class BeanConfig { }
4、BeanPostProcessor實(shí)現(xiàn)類(后置處理器)
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; /** * 后置處理器:初始化前后進(jìn)行處理工作 */ @Component public class MyBeanPostProcessor implements BeanPostProcessor { /** * 初始化之前工作 * @param bean * @param beanName * @return * @throws BeansException */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化之前..."+beanName+"=["+bean+"]"); return bean; } /** * 初始化之后工作 * @param bean * @param beanName * @return * @throws BeansException */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化之后..."+beanName+"=["+bean+"]"); return bean; } }
5、測(cè)試結(jié)果
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Mybatis-plus使用selectList查詢數(shù)據(jù)為null的問題及解決辦法
這篇文章主要介紹了Mybatis-plus使用selectList查詢數(shù)據(jù)為null的問題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07SpringBoot實(shí)現(xiàn)定時(shí)任務(wù)和異步調(diào)用
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)定時(shí)任務(wù)和異步調(diào)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04整理Java的MyBatis框架中一些重要的功能及基本使用示例
這篇文章主要介紹了Java的MyBatis框架中一些重要的功能及基本使用示例整理,MyBatis可以幫助Java程序進(jìn)行強(qiáng)大的數(shù)據(jù)庫操作,需要的朋友可以參考下2016-04-04Java基礎(chǔ)之詳解基本數(shù)據(jù)類型的使用
今天給大家?guī)淼氖顷P(guān)于Java基礎(chǔ)的相關(guān)知識(shí),文章圍繞著基本數(shù)據(jù)類型的使用展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Java 實(shí)現(xiàn)攔截器Interceptor的攔截功能方式
這篇文章主要介紹了Java 實(shí)現(xiàn)攔截器Interceptor的攔截功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題
這篇文章主要介紹了解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09如何使用JCTools實(shí)現(xiàn)Java并發(fā)程序
這篇文章主要介紹了如何使用JCTools實(shí)現(xiàn)Java并發(fā)程序,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03jdk-logging?log4j?logback日志系統(tǒng)實(shí)現(xiàn)機(jī)制原理介紹
這篇文章主要介紹了jdk-logging、log4j、logback日志介紹以及三個(gè)日志系統(tǒng)的實(shí)現(xiàn)機(jī)制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03