Spring4学习回顾之路06- IOC容器中Bean的生命周期方法
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的生命周期方法的更多相关文章
- Spring(十二):IOC容器中Bean的生命周期方法
IOC容器中Bean的生命周期方法 1)Spring IOC容器可以管理Bean的声明周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2)Spring IOC容器对Bean的生命周期 ...
- spring IOC 容器中 Bean 的生命周期
IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 后置处理器接口(BeanPostPr ...
- Spring IOC容器中Bean的生命周期
1.IOC容器中Bean的生命周期 构造器函数 设置属性 初始化函数(在Bean配置中 init-method) 使用Bean 结束时关闭容器(在Bean中配置destroy-method) 2.Be ...
- Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...
- IOC容器中bean的生命周期
一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...
- Spring重点—— IOC 容器中 Bean 的生命周期
一.理解 Bean 的生命周期,对学习 Spring 的整个运行流程有极大的帮助. 二.在 IOC 容器中,Bean 的生命周期由 Spring IOC 容器进行管理. 三.在没有添加后置处理器的情况 ...
- [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)
Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...
- 7 -- Spring的基本用法 -- 9...容器中Bean的生命周期
7.9 容器中Bean的生命周期 Spring可以管理singleton作用域的Bean的生命周期,Spring可以精确地知道该Bean何时被创建,何时被初始化完成.容器何时准备销毁该Bean实例. ...
随机推荐
- jQuery系列(二):jQuery的选择器
css中的选择器有:
- 洛谷P2634 [国家集训队]聪聪可可 点分治模板
题意 在一棵树上任意选两个点,求它们距离模3为0的概率. 分析 树分治模板 Code #include<bits/stdc++.h> #define fi first #define se ...
- Selenium定位class包含空格的元素-复合class节点
在HTML中, 节点有三种常见属性, 分别是id, name和class, 其中class是一个特殊的属性, 支持多个类名, 以空格隔开, 如下图所示: 你是否注意到, 为什么selenium中的fi ...
- Python实用黑科技——以某个字段进行分组
需求: 当前有个字典实例,你想以某个字段比如”日期”对整个字典里面的元素进行分组. 方法: itertools.groupby()函数是专门用来干这个活的.请看下面这个例子,这里有一个列表构成的字典, ...
- AcWing:237. 程序自动分析(离散化 + 并查集)
在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xjxi=x ...
- moveDown()
这里在判断边界时,判断的是 y == HEIGHT - 1. void moveDown(){ //定义变量存放人物下方的坐标 int dx, dy; //当下方没有元素时,直接return if(y ...
- js获取整个屏幕的尺寸
原文 首先获取屏幕宽度:window.screen.width; //整个屏幕的宽度. 然后获取屏幕高度:window.screen.height; //整个屏幕的高度. 获取可用工作区 ...
- ORA-12899 导入失败
主要是目标数据库的字符集与导入文件的字符集不符 SQL>SHUTDOWN IMMEDIATE SQL>STARTUP MOUNT SQL>ALTER SYSTEM ENABLE RE ...
- LC 454. 4Sum II
Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...
- IDEA使用git
本文转自:http://www.cnblogs.com/java-maowei/p/5950930.html 一.安装git 下载地址: https://git-scm.com/download/w ...