spring之bean的生命周期
2019-09-17 10:24:56来源:博客园 阅读 ()
spring之bean的生命周期
生命周期的过程:
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;
}
}
原文链接:https://www.cnblogs.com/lee0527/p/11502660.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash