Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务。

Spring IOC 容器对 bean 的生命周期进行管理的过程:

  • 通过构造器或者工厂方法创建 bean 实例。
  • 为 bean 的属性赋值和对其他 bean 的引用。
  • 调用 bean 的初始化方法。
  • bean 初始成功,可以使用。
  • 容器关闭时 , 调用 bean 的销毁方法。

在 bean 的声明里设置 init-method 和 destroy-method 属性 , 为 bean 指定初始化和销毁方法。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5.  
  6. <bean id="initBean" class="com.itdjx.spring.beans.init.InitBean" init-method="init" destroy-method="destroy">
  7. <property name="name" value="操蛋儿"/>
  8. <property name="info" value="my name is ET"/>
  9. </bean>
  10.  
  11. </beans>
  1. package com.itdjx.spring.beans.init;
  2.  
  3. /**
  4. * @author Wáng Chéng Dá
  5. * @create 2017-03-02 16:07
  6. */
  7. public class InitBean {
  8.  
  9. private String name;
  10.  
  11. private String info;
  12.  
  13. public InitBean() {
  14. System.out.println("I am InitBean's Constructor...");
  15. }
  16.  
  17. public void init() {
  18. System.out.println("I am InitBean's init method...");
  19. }
  20.  
  21. public void destroy() {
  22. System.out.println("I am InitBean's destroy method...");
  23. }
  24.  
  25. public String getName() {
  26. return name;
  27. }
  28.  
  29. public void setName(String name) {
  30. System.out.println("I am InitBean's setName method...");
  31. this.name = name;
  32. }
  33.  
  34. public String getInfo() {
  35. return info;
  36. }
  37.  
  38. public void setInfo(String info) {
  39. System.out.println("I am InitBean's serInfo method...");
  40. this.info = info;
  41. }
  42.  
  43. @Override
  44. public String toString() {
  45. return "InitBean{" +
  46. "name='" + name + '\'' +
  47. ", info='" + info + '\'' +
  48. '}';
  49. }
  50. }
  1. package com.itdjx.spring.beans.init;
  2.  
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4.  
  5. /**
  6. * @author Wáng Chéng Dá
  7. * @create 2017-03-02 16:16
  8. */
  9. public class Main {
  10.  
  11. public static void main(String[] args) {
  12.  
  13. ClassPathXmlApplicationContext cxt = new ClassPathXmlApplicationContext("beans-init.xml");
  14. InitBean initBean = (InitBean) cxt.getBean("initBean");
  15. System.out.println(initBean);
  16. cxt.close();
  17.  
  18. }
  19. }

控制台输出:

I am InitBean's Constructor...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am InitBean's init method...
InitBean{name='操蛋儿', info='my name is ET'}
I am InitBean's destroy method...

bean 后置处理器:

  • bean 后置处理器允许在调用初始方法前后对 bean 进行额外的处理。
  • bean 后置处理器对 IOC 容器里的所有 bean 实例逐一处理 , 而非单一实例。
  • bean 后置处理器需要实现 BeanPostProcessor Interface , 在初始化方法被调用前后 , Spring 将把每个 bean 实例分别传送给上述接口的两个方法。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5.  
  6. <bean id="initBean" class="com.itdjx.spring.beans.init.InitBean" init-method="init" destroy-method="destroy">
  7. <property name="name" value="操蛋儿"/>
  8. <property name="info" value="my name is ET"/>
  9. </bean>
  10.  
  11. <bean class="com.itdjx.spring.beans.init.MyBeanPostProcessor"/>
  12.  
  13. </beans>
  1. package com.itdjx.spring.beans.init;
  2.  
  3. import org.springframework.beans.BeansException;
  4. import org.springframework.beans.factory.config.BeanPostProcessor;
  5.  
  6. /**
  7. * 我的 bean 后置处理器
  8. *
  9. * @author Wáng Chéng Dá
  10. * @create 2017-03-02 16:25
  11. */
  12. public class MyBeanPostProcessor implements BeanPostProcessor {
  13.  
  14. @Override
  15. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  16. System.out.println("I am MyBeanPostProcessor's before method...bean: " + bean + " beanName: " + beanName);
  17. return bean;
  18. }
  19.  
  20. @Override
  21. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  22. System.out.println("I am MyBeanPostProcessor's after method...bean: " + bean + " beanName: " + beanName);
  23. return bean;
  24. }
  25. }

控制台输出:

I am InitBean's Constructor...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am MyBeanPostProcessor's before method...bean: InitBean{name='操蛋儿', info='my name is ET'} beanName: initBean
I am InitBean's init method...
I am MyBeanPostProcessor's after method...bean: InitBean{name='操蛋儿', info='my name is ET'} beanName: initBean
InitBean{name='操蛋儿', info='my name is ET'}
I am InitBean's destroy method...

bean:实例本身。

beanName:IOC 容器配置的 bean 的名字

返回值:是实际上返给用户的那个 bean 实例 , 注意:可以在上述两个方法中修改 bean 的属性 , 甚至返回一个新的 bean 实例。

添加 bean 后置处理器的 bean 的生命周期:

  • 通过构造器或工厂方法创建 bean 实例。
  • 为 bean 的属性赋值和对其他 bean 的引用。
  • 将 bean 实例传递给 bean 后置处理器的 postProcessBeforeInitialization 方法。
  • 调用 bean 的初始化方法。
  • 将 bean 实例传递非 bean 后置处理器的 postProcessAfterInitialization 方法。
  • bean 初始化成功 , 可以使用。
  • 容器关闭时 , 调用 bean 的销毁方法。
  1. package com.itdjx.spring.beans.init;
  2.  
  3. import org.springframework.beans.BeansException;
  4. import org.springframework.beans.factory.config.BeanPostProcessor;
  5.  
  6. /**
  7. * 我的 bean 后置处理器
  8. *
  9. * @author Wáng Chéng Dá
  10. * @create 2017-03-02 16:25
  11. */
  12. public class MyBeanPostProcessor implements BeanPostProcessor {
  13.  
  14. @Override
  15. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  16. System.out.println("I am MyBeanPostProcessor's before method...bean: " + bean + " beanName: " + beanName);
  17. InitBean initBean = new InitBean();
  18. initBean.setName("狗剩儿");
  19. initBean.setInfo("I am the revised infomation...");
  20. return initBean;
  21. }
  22.  
  23. @Override
  24. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  25. System.out.println("I am MyBeanPostProcessor's after method...bean: " + bean + " beanName: " + beanName);
  26. return bean;
  27. }
  28. }

控制台输出:

I am InitBean's Constructor...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am MyBeanPostProcessor's before method...bean: InitBean{name='操蛋儿', info='my name is ET'} beanName: initBean
I am InitBean's Constructor...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am InitBean's init method...
I am MyBeanPostProcessor's after method...bean: InitBean{name='狗剩儿', info='I am the revised infomation...'} beanName: initBean
InitBean{name='狗剩儿', info='I am the revised infomation...'}
I am InitBean's destroy method...

Spring学习-- IOC 容器中 bean 的生命周期的更多相关文章

  1. Spring重点—— IOC 容器中 Bean 的生命周期

    一.理解 Bean 的生命周期,对学习 Spring 的整个运行流程有极大的帮助. 二.在 IOC 容器中,Bean 的生命周期由 Spring IOC 容器进行管理. 三.在没有添加后置处理器的情况 ...

  2. Spring(十二):IOC容器中Bean的生命周期方法

    IOC容器中Bean的生命周期方法 1)Spring IOC容器可以管理Bean的声明周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2)Spring IOC容器对Bean的生命周期 ...

  3. spring IOC 容器中 Bean 的生命周期

    IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 后置处理器接口(BeanPostPr ...

  4. Spring IOC容器中Bean的生命周期

    1.IOC容器中Bean的生命周期 构造器函数 设置属性 初始化函数(在Bean配置中 init-method) 使用Bean 结束时关闭容器(在Bean中配置destroy-method) 2.Be ...

  5. IOC容器中bean的生命周期

    一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...

  6. [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)

    Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...

  8. Spring4学习回顾之路06- IOC容器中Bean的生命周期方法

    SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行特定的任务! Spring IOC容器对Bean的生命周期进行管理的过程: -通过构造器或者工厂方法创建 ...

  9. 7 -- Spring的基本用法 -- 9...容器中Bean的生命周期

    7.9 容器中Bean的生命周期 Spring可以管理singleton作用域的Bean的生命周期,Spring可以精确地知道该Bean何时被创建,何时被初始化完成.容器何时准备销毁该Bean实例. ...

随机推荐

  1. JSON初体验(二):Gson解析

    今天,我们来介绍一下Gson的jar包的用法. JSON解析之Gson 特点:编码简介,谷歌官方推荐 数据之间的转换: 1.将json格式的字符串{}转换成为java对象 API: <T> ...

  2. Nginx一直报504超时,配置相关参数好了

    相关参数:large_client_header_buffers 4 16k;client_max_body_size 30m;client_body_buffer_size 128k;proxy_c ...

  3. OpenCV代码提取:transpose函数的实现

    OpenCV中的transpose函数实现图像转置,公式为: 目前fbc_cv库中也实现了transpose函数,支持多通道,uchar和float两种数据类型,经测试,与OpenCV3.1结果完全一 ...

  4. asp.net MVC+easyUI 文件上传

    前言:公司前端都是index页面引用js,剩下的添加...都是html页.加大操作难度5555,所以就是主页面操作子页面上传.效果如下: 1,前端html页代码如下 .其中请注意,form中encty ...

  5. (原)UnrealObj篇 : 反射获取Struct类型

    @Author: 白袍小道 转载请说明     案例一:蓝图传递任意Struct ,导出struct的相关属性 相关: 1.宏:DECLARE_FUNCTION: 此宏用于在自动生成的样板代码中声明t ...

  6. lock关键字的使用

    最近在代码中,发现别人使用了lock关键字,为了理解别人写的代码,所以自己对lock关键字的使用研究了下. 微软官方解释,请百度:lock 语句(C# 参考) 微软给了个官网实例代码: class A ...

  7. Python创建目录文件夹

    Python对文件的操作还算是方便的,只需要包含os模块进来,使用相关函数即可实现目录的创建. 主要涉及到三个函数 1.os.path.exists(path) 判断一个目录是否存在 2.os.mak ...

  8. kkpager的改进,Ajax数据变化但是页码不变的问题,kkpagerajax

    最近做项目用到了kkpager来做分页,在一个页面只是调用一次的时候不会出现问题,但是在一个页面多次调用就出现问题了. 在网上搜集了好久,终于找到了解决方法,记录下来方便以后使用.希望也可以方便需要的 ...

  9. 【Autofac】- 创建的类的生命周期

    1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 官方文档解释:Configure the component so tha ...

  10. bcc编译

    bcc编译,直接在docker里编,太方便:第一次深切体会到docker的强大: 1)下载bcc源码: 2) 把源码中的Dockerfile.ubuntu重命名为Dockerfile 3)sudo d ...