spring之bean的生命週期
阿新 • • 發佈:2019-09-10
生命週期的過程:
spring容器管理bean的生命週期
bean的建立——初始化——銷燬
我們也可以通過自定義初始化和銷燬方法:容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法
1)指定初始化和銷燬方法
bean的實體類:
public class Blue { public Blue(){ System.out.println("執行了構造方法..."); } public void init(){ System.out.println("執行了初始化方法..."); } public void destroy(){ System.out.println("執行了銷燬方法"); } }
MainConfig配置類:
@Bean(initMethod = "init",destroyMethod = "destroy")
public Blue blue(){
return new Blue();
}
測試類:
public class IocTest { private AnnotationConfigApplicationContext applicationContext; @Before public void init(){ applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); System.out.println("容器建立完成了..."); } @Test public void testLifeCycle(){ applicationContext.getBean("blue"); applicationContext.close(); } }
測試結果:
九月 10, 2019 5:05:37 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh 資訊: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 17:05:37 CST 2019]; root of context hierarchy 執行了構造方法... 執行了初始化方法... 容器建立完成了... 九月 10, 2019 5:05:37 下午 org.springframework.context.support.AbstractApplicationContext doClose 執行了銷燬方法
結論:我們可以看到指定的初始化方法是在bean物件建立完成後呼叫,銷燬方法是在容器關閉的時候呼叫的。
值得一提的是如果bean物件是多例項的時候,spring不會呼叫其銷燬方法,物件的銷燬由JVM進行回收。
2)InitializingBean和DisposableBean
作用:我們可以通過讓Bean實現InitializingBean(定義初始化邏輯)和DisposableBean(定義銷燬邏輯)
Cat實體類
@Component
public class Cat implements InitializingBean,DisposableBean {
public Cat(){
System.out.println("執行了構造方法...");
}
public void destroy() throws Exception {
System.out.println("destroy...");
}
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet...");
}
}
測試類
public class IocTest {
private AnnotationConfigApplicationContext applicationContext;
@Before
public void init(){
applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
System.out.println("容器建立完成了...");
}
@Test
public void testLifeCycle(){
applicationContext.getBean("cat");
applicationContext.close();
}
}
測試結果
資訊: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 17:26:30 CST 2019]; root of context hierarchy
執行了構造方法...
afterPropertiesSet...
容器建立完成了...
九月 10, 2019 5:26:30 下午 org.springframework.context.support.AbstractApplicationContext doClose
資訊: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 17:26:30 CST 2019]; root of context hierarchy
destroy...
3)JSR250
作用:在這裡你可以使用@PostConstruct註解作為初始化回撥的替代和@PreDestroy註解作為銷燬回撥的替代
Bean實體類
@Component
public class Blue {
public Blue(){
System.out.println("構造方法執行了...");
}
//物件建立並賦值之後呼叫
@PostConstruct
public void init(){
System.out.println("init...執行了");
}
//移除Bean之後呼叫
@PreDestroy
public void destroy(){
System.out.println("destroy...執行了");
}
}
測試類
public class IocTest {
private AnnotationConfigApplicationContext applicationContext;
@Before
public void init(){
applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
System.out.println("容器建立完成了...");
}
@Test
public void testLifeCycle(){
applicationContext.getBean("blue");
applicationContext.close();
}
}
測試結果
九月 10, 2019 7:41:06 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
資訊: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 19:41:06 CST 2019]; root of context hierarchy
構造方法執行了...
init...執行了
九月 10, 2019 7:41:06 下午 org.springframework.context.support.AbstractApplicationContext doClose
資訊: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 19:41:06 CST 2019]; root of context hierarchy
容器建立完成了...
destroy...執行了
4)BeanPostProcessor後置處理器
作用:可以自定義BeanPostProcessor的實現類來對bean物件初始化前後進行操作
@Component
public class MyBeanPostProcessor implements BeanPostProcessor{
/**
*
* @param bean 將要建立的例項物件
* @param beanName 例項物件在容器中的名字
* @return 我們可以將要建立的bean物件進行包裝之後返回
* @throws BeansException
*/
//bean物件初始化方法執行前執行
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization...執行了");
return bean;
}
//bean物件初始化方法執行後執行
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization...執行了");
return bean;
}
}