bean的生命周期指的是bean的创建——>初始化——>销毁的过程,该过程是由spring容器进行管理的

我们可以自定义bean初始化和销毁的方法:容器在bean进行到当前生命周期时,调用自定义的初始化和销毁方法

自定义初始化和销毁方法

init-method、destroy-method

配置文件的bean标签中配置init-method、destroy-method属性

<bean id="user" class="com.enjoy.study.pojo.User" init-method="init" destroy-method="destroy"/>

bean类
public class User {
public User() {
System.out.println("user....constructor..........");
} public void init(){
System.out.println("user....init..........");
} public void destroy(){
System.out.println("user....destroy..........");
}
}

测试类
public class Cap7Test {
@Test
public void cap7Test(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:beans.xml");
System.out.println("ioc容器启动完成");
context.close();
}
}

结果
user....constructor..........
user....init.......... ioc容器启动完成
user....destroy..........

initMethod、destroyMethod

@Bean配置initMethod、destroyMethod属性

单实例情况:

@Configuration
public class Cap7MainConfig {
@Bean(initMethod = "init",destroyMethod = "destroy")
public User user(){
return new User();
}
}

测试方法
@Test
public void annoTest(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Cap7MainConfig.class);
System.out.println("ioc容器启动完成");
context.close();
}

结果
user....constructor..........
user....init.......... ioc容器启动完成
user....destroy..........

多实例情况:

@Configuration
public class Cap7MainConfig {
@Scope("prototype")
@Bean(initMethod = "init",destroyMethod = "destroy")
public User user(){
return new User();
}
}

结果
ioc容器启动完成  

单实例情况下,容器启动时完成bean的实例化,容器关闭时进行bean的销毁

多实例情况下,容器启动时不进行bean的实例化,获取bean时实例化bean对象,所以启动后直接关闭容器,容器中并未进行bean的管理

InitializingBean、DisposableBean接口

bean实现InitializingBean接口,实现afterPropertiesSet()方法:beanFactory创建对象完成,并且设置完属性后,调用该方法,相当于初始化方法

bean实现DisposableBean接口,实现destroy()方法:bean对象销毁时,调用该方法

public class User implements InitializingBean,DisposableBean {
public User() {
System.out.println("user....constructor..........");
} @Override
public void afterPropertiesSet() throws Exception {
System.out.println("user....afterPropertiesSet.........");
} @Override
public void destroy() throws Exception {
System.out.println("user....destroy............");
}
}

配置类
@Configuration
public class Cap7MainConfig {
@Bean
public User user(){
return new User();
}
}

结果
user....constructor..........
user....afterPropertiesSet.........
ioc容器启动完成
user....destroy............

@PostConstruct、@PreDestroy

@Component
public class User{
public User() {
System.out.println("user....constructor..........");
} //对象创建并赋值后使用
@PostConstruct
public void init() {
System.out.println("user....init.........");
} //容器移除对象之前回调通知,销毁bean
@PreDestroy
public void destroy() {
System.out.println("user....destroy............");
}
}

配置类
@Configuration
@ComponentScan("com.enjoy.study.cap7")
public class Cap7MainConfig {
}

结果
user....constructor..........
user....init......... ioc容器启动完成
user....destroy............

BeanPostProcessor

后置处理器,负责在初始化前后做相应处理

/**
* 后置处理器
* @Component,将后置处理器加入容器中
* @author qf
* @create 2019-05-22 10:05
*/
@Component
public class MyBeanPostProcessor implements BeanPostProcessor { /**
* 在初始化之前进行相应后置处理工作。比如在init-method方法执行之前,或者initializingBean的afterPropertiesSet方法之前
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization......"+bean+"........."+beanName);
return bean;
} /**
* 在初始化之后进行相应后置处理工作
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization......"+bean+"........."+beanName);
return bean;
}
}

测试

@Component
public class User implements InitializingBean,DisposableBean { @Override
public void destroy() throws Exception {
System.out.println("user....destroy........");
} @Override
public void afterPropertiesSet() throws Exception {
System.out.println("user....afterPropertiesSet........");
}
}

配置类
@Configuration
@ComponentScan("com.enjoy.study.cap8")
public class Cap8MainConfig {
}

测试类
public class Cap8Test {
@Test
public void cap8Test(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Cap8MainConfig.class);
System.out.println("ioc容器创建完成");
context.close();
}
}

结果
postProcessBeforeInitialization...............org.springframework.context.event.internalEventListenerProcessor
postProcessAfterInitialization...............org.springframework.context.event.internalEventListenerProcessor
postProcessBeforeInitialization...............org.springframework.context.event.internalEventListenerFactory
postProcessAfterInitialization...............org.springframework.context.event.internalEventListenerFactory
postProcessBeforeInitialization...............cap8MainConfig
postProcessAfterInitialization...............cap8MainConfig
postProcessBeforeInitialization...............user
user....afterPropertiesSet........
postProcessAfterInitialization...............user ioc容器创建完成 user....destroy........

  

spring(二):bean的生命周期的更多相关文章

  1. 一次性讲清楚spring中bean的生命周期之二:FactoryBean的前世今生

    前言 在<spring中FactoryBean是什么bean>一文中,带着小伙伴学习了spring中的FactoryBean,了解了到了FactoryBean其实是一种生产Bean的bea ...

  2. 深究Spring中Bean的生命周期

    前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上 ...

  3. 如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

    前言 当你准备去复习Spring中Bean的生命周期的时候,这个时候你开始上网找资料,很大概率会看到下面这张图: 先不论这张图上是否全面,但是就说这张图吧,你是不是背了又忘,忘了又背? 究其原因在于, ...

  4. 一次性讲清楚spring中bean的生命周期之三:bean是如何实例化的

    在前面的两篇博文<一次性讲清楚spring中bean的生命周期之一:getSingleton方法>和<一次性讲清楚spring中bean的生命周期之二:FactoryBean的前世今 ...

  5. JAVA面试题:Spring中bean的生命周期

    Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一 ...

  6. 深入理解Spring中bean的生命周期

    [Spring中bean的生命周期] bean的生命周期 1.以ApplocationContext上下文单例模式装配bean为例,深入探讨bean的生命周期: (1).生命周期图: (2).具体事例 ...

  7. Spring中Bean的生命周期及其扩展点

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6106456.html Spring中Bean的管理是其最基本的功能,根据下面的图来了解Spr ...

  8. 简:Spring中Bean的生命周期及代码示例

    (重要:spring bean的生命周期. spring的bean周期,装配.看过spring 源码吗?(把容器启动过程说了一遍,xml解析,bean装载,bean缓存等)) 完整的生命周期概述(牢记 ...

  9. 面试Spring之bean的生命周期

    找工作的时候有些人会被问道Spring中Bean的生命周期,其实也就是考察一下对Spring是否熟悉,工作中很少用到其中的内容,那我们简单看一下. 在说明前可以思考一下Servlet的生命周期:实例化 ...

  10. 通过BeanPostProcessor理解Spring中Bean的生命周期

    通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 Spring源码解析(十一)Spring扩展接口InstantiationAwareBeanPostProces ...

随机推荐

  1. simrank python实现

    1.数据 pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp.com pc,hp ...

  2. JavaScript 工作原理之十-使用 MutationObserver 监测 DOM 变化

    原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十章. 网络 ...

  3. 手工实现Array List和Linked List

    Array List样例: /** * 增加泛型 * 自动增加数组容量 * 增加set.get方法:增加数组边界的检查 * 增加remove方法 */package cn.study.lu.four; ...

  4. Qt 倒计时验证码按钮效果

    本来还想继承QTimer跟QPushButton去实现,后来发现可以使用两个QTimer来实现: 验证码倒计时间:(60s) 封装到widget类里: 需要这几个数据:Button,TimerA,Ti ...

  5. re模块 时间模块

    # 正则模块'''正则就是用一些具有特殊含义的符号组合到一起用来描述字符或字符串的方法或者说,正则就是用来描述一类事物的规则它内嵌在python中,并通过re模块实现正则表达式模式被编译成一系列的字节 ...

  6. iOS设计模式之桥接模式

    一,什么是桥接模式 定义 抽象出层次结构.上层抽象接口的职能,实现上层抽象接口的职能,层级间的通信协议(可以抽象为接口).桥接模式的目的,就是把抽象层次结构从具体的实现中分离出来,使其能够独立变更.抽 ...

  7. 【转】通过Nginx部署Django

    https://www.cnblogs.com/frchen/p/5709533.html Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中, ...

  8. Emmet基本使用教程

    转载来自:http://www.iteye.com/news/27580 Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语 ...

  9. vue2.0 之 douban (七)APP 打包

    在打包之前需要修改一个地方,那就是config->index.js文件,修改assetsPublicPath: '/'为assetsPublicPath: './',截图如下 上面文件改好后,开 ...

  10. 【黑科技】花几分钟和孩子动手DIY,即可用手机完成全息影像!

    http://baobao.sohu.com/20160902/n467277059.shtml [黑科技]花几分钟和孩子动手DIY,即可用手机完成全息影像! 杭州亲子圈2016-09-02 07:2 ...