SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行特定的任务!

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

  -通过构造器或者工厂方法创建Bean实例

  -为Bean的属性设置值和对其他Bean的引用

  -调用Bean的初始化方法

  -Bean可以使用了

  -当容器关闭了,调用Bean的销毁方法

在Bean的声明中设置init-method和destory-method属性,为Bean指定初始化和销毁方法;如图:

  <bean id="student2" class="com.lql.spring03.Student" init-method="init" destroy-method="destory ">
<property name="name" value="#{'lql'}"></property>
<property name="age" value="#{17}"></property>
</bean>  

当然,除了上述五个过程之外,Bean的生命周期可以更“丰富”点,于是就有了“Bean后置处理器”

Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理;Bean后置处理器对IOC容器里所有的Bean实例逐一处理,而非单一实例。对Bean后置处理器而言,需要实现org.springframework.beans.factory.config.BeanPostProcessor接口,在初始化方法被调用前后,Spring将每个Bean实例分别传递给上述接口的以下两个方法:

package org.springframework.beans.factory.config;

import org.springframework.beans.BeansException;

public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException; Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}

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

  -通过构造器或者工厂方法创建Bean实例

  -为Bean的属性设置值和对其他Bean的引用

  -将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法

  -调用Bean的初始化方法

  -将Bean实例传递给Bean后置处理器的postProcessAfterInitialization方法

  -Bean可以使用了

  -当容器关闭了,调用Bean的销毁方法

案例:建立Bean后置处理器类

package com.lql.spring03;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; /**
* @author: lql
* @date: 2019.10.26
* Description:
* Created with IntelliJ IDEA
*/
public class MyBeanPostProcessor implements BeanPostProcessor{
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization :" + beanName +", " + bean);
return bean;
} @Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization:" + beanName +", " + bean);
return bean;
}
}

在xml配置文件中配置Bean后置处理器:

  <!--配置bean的后置处理器-->
<bean class="com.lql.spring03.MyBeanPostProcessor"></bean>

Student.java

package com.lql.spring03;

/**
* @author: lql
* @date: 2019.10.12
* Description:
* Created with IntelliJ IDEA
*/
public class Student { private String name; private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

测试类:

package com.lql.spring03;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* @author: lql
* @date: 2019.10.12
* Description:
* Created with IntelliJ IDEA
*/
public class Test { public static void main(String[] args) { ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("scope.xml");
Student student = app.getBean("student", Student.class);
System.out.println(student); }
}

输出则显示:

postProcessBeforeInitialization :student, Student{name='lql', age=17}
postProcessAfterInitialization:student, Student{name='lql', age=17}
Student{name='lql', age=17}

但是这样有注入危险,比如更改Bean后置处理器的after方法:更改如下:

 @Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization:" + beanName +", " + bean); Student student = new Student();
student.setName("张三");
return student;
}

这样测试的结果是:

postProcessBeforeInitialization :student, Student{name='lql', age=17}
postProcessAfterInitialization:student, Student{name='lql', age=17}
Student{name='张三', age=0}

还有个需要注意的是:因为Bean后置处理器是处理所以Bean的,所以可以这么修改:

 @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if ("student".equals(beanName)) {
//处理步骤
} System.out.println("postProcessBeforeInitialization :" + beanName +", " + bean);
return bean;
}

关于BeanPostProcessor的一些说明:

  -接口,实现用来作用于Bean后置处理器

  -两个方法:Object postProcessBeforeInitialization(Object bean, String beanName):init-method之前被调用

        Object postProcessAfterInitialization(Object bean, String beanName):init-method之后被调用

  参数 bean: bean 实例本身

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

  返回值:是实际上返回给用户的那个Bean,但是可以在上面两个方法中修改返回的bean,甚至返回一个新的bean.

Spring4学习回顾之路06- IOC容器中Bean的生命周期方法的更多相关文章

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

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

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

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

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

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

  4. Spring学习-- IOC 容器中 bean 的生命周期

    Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Django从Models 10分钟定制一个Admin后台

    目录 Django从Models 10分钟建立一套RestfulApi Django从Models 10分钟定制一个Admin后台 简介 Django自带一个Admin后台, 支持用户创建,权限配置和 ...

  2. #define定义宏函数 的正确使用

    如何使用宏来定义一个自定义函数呢?首先我们来看下面这段代码 #define SQUARE(x) x*x int main() { int a = 5; printf("SQUARE(a): ...

  3. 泛目录程序(莲花泛目录程序/黑帽SEO/寄生虫/莲花泛目录解析/泛目录软件)

    莲花泛目录程序强大之处: 1.内容分类详细2.自动推送URL链接3.内置超强原创内容功能系统,页面深受百度搜索引擎喜爱.4.蜘蛛触发繁殖:蜘蛛触发程序任何页面,程序自动生成独立页面并引导繁殖.5.操作 ...

  4. 在浏览器上打开、预览Excel xlsx表格文件

    现在的HTML5,有了FileReader文件读写API, 真是让javascript的能力大幅提升. 解析zip压缩文件.解析Excel xlsx 表格文档各种文件预览,实现起来也有了可能性,以前的 ...

  5. JVM模型及内存溢出

    一.JVM截图及概念 图1:JVM虚拟机运行时数据区域概念模型 1.程序计数器:内存空间中的一块小区域,作为当前线程所执行的字节码的行号指示器,注:如果是native方法,计数器为空 2.虚拟机栈:线 ...

  6. 16.合并两个排序的链表 Java

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路 两种解法:递归和非递归 参考代码 /* public class ListNode { ...

  7. C#_选择结构,Console的应用,数据类型转换

    1:先看一个顺序结构编程,代码如下: using System; using System.Collections.Generic; using System.Linq; using System.T ...

  8. js 中null,undefined区别

    首先摘自阮一峰先生的文章: 大多数计算机语言,有且仅有一个表示"无"的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil. 有点奇 ...

  9. python Telnet通讯

    摘要: python中telnetlib模块的使用: http://blog.csdn.net/five3/article/details/8099997 python实现telnet: http:/ ...

  10. EBS 查看输出HTML报表问题总结

    问题一: 请求输出格式为HTML(如下图,默认浏览器输出),希望 查看输出 的时候能够实现excel输出. 解决方法: 路径:系统管理员/安装/浏览器选项 注:维护如下记录 文件格式:HTML    ...