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

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

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

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

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="initBean" class="com.itdjx.spring.beans.init.InitBean" init-method="init" destroy-method="destroy">
<property name="name" value="操蛋儿"/>
<property name="info" value="my name is ET"/>
</bean> </beans>
 package com.itdjx.spring.beans.init;

 /**
* @author Wáng Chéng Dá
* @create 2017-03-02 16:07
*/
public class InitBean { private String name; private String info; public InitBean() {
System.out.println("I am InitBean's Constructor...");
} public void init() {
System.out.println("I am InitBean's init method...");
} public void destroy() {
System.out.println("I am InitBean's destroy method...");
} public String getName() {
return name;
} public void setName(String name) {
System.out.println("I am InitBean's setName method...");
this.name = name;
} public String getInfo() {
return info;
} public void setInfo(String info) {
System.out.println("I am InitBean's serInfo method...");
this.info = info;
} @Override
public String toString() {
return "InitBean{" +
"name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
}
 package com.itdjx.spring.beans.init;

 import org.springframework.context.support.ClassPathXmlApplicationContext;

 /**
* @author Wáng Chéng Dá
* @create 2017-03-02 16:16
*/
public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext cxt = new ClassPathXmlApplicationContext("beans-init.xml");
InitBean initBean = (InitBean) cxt.getBean("initBean");
System.out.println(initBean);
cxt.close(); }
}

控制台输出:

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 实例分别传送给上述接口的两个方法。
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="initBean" class="com.itdjx.spring.beans.init.InitBean" init-method="init" destroy-method="destroy">
<property name="name" value="操蛋儿"/>
<property name="info" value="my name is ET"/>
</bean> <bean class="com.itdjx.spring.beans.init.MyBeanPostProcessor"/> </beans>
 package com.itdjx.spring.beans.init;

 import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; /**
* 我的 bean 后置处理器
*
* @author Wáng Chéng Dá
* @create 2017-03-02 16:25
*/
public class MyBeanPostProcessor implements BeanPostProcessor { @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("I am MyBeanPostProcessor's before method...bean: " + bean + " beanName: " + beanName);
return bean;
} @Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("I am MyBeanPostProcessor's after method...bean: " + bean + " beanName: " + beanName);
return bean;
}
}

控制台输出:

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 的销毁方法。
 package com.itdjx.spring.beans.init;

 import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; /**
* 我的 bean 后置处理器
*
* @author Wáng Chéng Dá
* @create 2017-03-02 16:25
*/
public class MyBeanPostProcessor implements BeanPostProcessor { @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("I am MyBeanPostProcessor's before method...bean: " + bean + " beanName: " + beanName);
InitBean initBean = new InitBean();
initBean.setName("狗剩儿");
initBean.setInfo("I am the revised infomation...");
return initBean;
} @Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("I am MyBeanPostProcessor's after method...bean: " + bean + " beanName: " + beanName);
return bean;
}
}

控制台输出:

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. centos配置npm全局安装

    使用-g全局安装在服务器需要配置,下面看看配置方法 配置全局安装路径和缓存路径 cd /usr/local/nodejs mkdir node_global mkdir node_cache npm ...

  2. C语言 字符数组与字符指针比较

    C语言 字符数组与字符指针比较 #include<stdio.h> /* 字符数组会在定以后预先分配内存空间字符串是常量所以会直接把字符串拷贝到数组中, 因为数组地址不同,所以不相等· 字 ...

  3. kudu是什么

    Apache Kudu Overview 建议配合[Apache Kudo]审阅本文(http://kudu.apache.org/overview.html) 数据模式 Kudo是一个列式存储的用于 ...

  4. Java线程:概念与使用

    Java线程大总结 原文章地址:一篇很老的专栏,但是现在看起来也感觉深受启发,知识点很多,很多线程特点我没有看,尴尬.但是还是整理了一下排版,转载一下. 操作系统中线程和进程的概念 在现代操作系统中, ...

  5. java Spring boot使用spring反射

    spring 反射 当你配置各种各样的bean时,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行. 1.可以通过类名去实例 ...

  6. netty学习记录2

    昨天晚上在看到7.2章MessagePack编码器和解码器开发这一章时,书里面没有贴出全部的代码,然后我按照我自己的想法把代码补全后,发现死活没有把代码跑通. 然后花了挺多时间在网上找,很多博客都贴出 ...

  7. Linux使用imagemagick的convert命令压缩图片,节省服务器空间

    1,安装imagemagick yum install ImageMagick 2,获取图片 find ./ -regex '.*\(jpg\|JPG\|png\|jpeg\)' -size +500 ...

  8. 做模态弹框的时候,防止背景滚动方法 移动端 html5

    $(window.document).bind("touchmove", function() { return false; });

  9. OpenCV入门:(七:OpenCV取随机数以及显示文字)

    1.随机颜色 OpenCV中自带了取随机数的方法,使用步骤: RNG rng( 0xFFFFFFFF ); 随机数 = rng.uniform( 下限,上限 ); 2.显示文字 , , bool bo ...

  10. 【廖雪峰老师python教程】day1

    主要内容摘要 函数参数[个人感觉难度很大,却很重要,可以先大概记一记]不要用的太复杂.戳这儿温习 递归函数:使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出.重点:找到递归关系和终止条件 ...