文章目录
一.生命周期
1.创建bean实例
public Emp() {
super();
System.out.println("One:创建对象Emp");
// TODO Auto-generated constructor stub
}
2.设置属性值
public void setEname(String ename) {
System.out.println("Two:依赖注入Emp");
this.ename = ename;
}
3.调用初始化方法
在xml配置文件中需要申明初始化方法名
<bean id="person" class="com.atguigu.ioc.life.Person" init-method="init" destroy-method="destory">
<property name="id" value="1001"></property>
<property name="sex" value="男"></property>
</bean>
public void init() {
System.out.println("Three:初始化Emp");
}
4.使用bean(调用一个toString方法吧)
@Override
public String toString() {
return "Four:Emp [ename=" + ename + "]";
}
5.容器关闭调用销毁方法
public void destory() {
System.out.println("Five:销毁Emp");
}
6.运行效果
7.总结(删除线部分为后置处理器部分)
i.通过构造器或工厂方法创建bean实例
ii.为bean的属性设置值和对其他bean的引用
iii.将bean实例传递给bean后置处理器的postProcessBeforeInitialization()方法
iv.调用bean的初始化方法
v.将bean实例传递给bean后置处理器的postProcessAfterInitialization()方法
vi.bean可以使用了
vii.当容器关闭时调用bean的销毁方法
二.后置处理器
1.什么时候起作用?
在调用初始化方法( Init() )前后对bean进行额外的处理
2.如何处理?
对IOC容器里的所有bean实例逐一处理,而非单一实例。其典型应用是:检查bean属性的正确性或根据特定的标准更改bean的属性
例:
@Override
public Object postProcessAfterInitialization(Object bean, String beanId) throws BeansException {
System.out.println("我是后置处理器初始化前执行的方法,处理的beanId为:"+beanId);
// 后置处理器会对配置文件中的bean采取顺序遍历的方式进行处理
if(beanId.equals("emp")) {
Emp emp=(Emp)bean;
System.out.println(emp);
}
else if(beanId.equals("person"))
{
Person person=(Person)bean;
System.out.println(person);
return person;
}
return null;
}
3.使用条件?
实现BeanPostProcessor接口,重写postProcessBeforeInitialization()、postProcessAfterInitialization两个方法做出处理;
package com.life;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class PostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanId) throws BeansException {
System.out.println("我是后置处理器初始化前执行的方法,处理的beanId为:"+beanId);
// 后置处理器会对配置文件中的bean采取顺序遍历的方式进行处理
if(beanId.equals("emp")) {
Emp emp=(Emp)bean;
System.out.println(emp);
}
else if(beanId.equals("person"))
{
Person person=(Person)bean;
System.out.println(person);
return person;
}
return null;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanId) throws BeansException {
// TODO Auto-generated method stub
System.out.println("我是后置处理器初始化后执行的方法,处理的beanId为:"+beanId);
return null;
}
}
三.实现代码
1.Emp类
package com.life;
public class Emp {
private Integer eid;
private String ename;
private String gender;
public Integer getEid() {
return eid;
}
public void setEid(Integer eid) {
this.eid = eid;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
System.out.println("two:Emp为bean的属性设置值和对其他bean的引用");
}
public Emp() {
super();
System.out.println("one:Emp通过构造器或工厂方法创建bean实例");
// TODO Auto-generated constructor stub
}
public Emp(Integer eid, String ename, String gender) {
super();
this.eid = eid;
this.ename = ename;
this.gender = gender;
}
public void init() {
System.out.println("Three:Emp调用bean的初始化方法");
}
public void destroy() {
System.out.println("Five:Emp容器关闭时,调用bean的销毁方法");
}
@Override
public String toString() {
// System.out.println("Four: bean可以使用了");
return "Four:Emp [eid=" + eid + ", ename=" + ename + ", gender=" + gender + "]";
}
}
2.Person类
package com.life;
public class Person {
private String pname;
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
System.out.println("two:Person为bean的属性设置值和对其他bean的引用");
}
public Person() {
super();
System.out.println("one:Person通过构造器或工厂方法创建bean实例");
// TODO Auto-generated constructor stub
}
public Person(String pname) {
super();
this.pname = pname;
}
public void init() {
System.out.println("Three:Person调用bean的初始化方法");
}
public void destroy() {
System.out.println("Five:Person容器关闭时,调用bean的销毁方法");
}
@Override
public String toString() {
return "Four:Person [pname=" + pname + "]";
}
}
3.后置处理器类
注意postProcessAfterInitialization、postProcessBeforeInitialization两个方法的顺序,返回对象要明确
package com.life;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class PostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanId) throws BeansException {
// TODO Auto-generated method stub
System.out.println("我是后置处理器初始化后执行的方法,处理的beanId为:" + beanId);
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanId) throws BeansException {
System.out.println("我是后置处理器初始化前执行的方法,处理的beanId为:" + beanId);
// 后置处理器会对配置文件中的bean采取顺序遍历的方式进行处理
if (beanId.equals("emp01")) {
Emp emp = (Emp) bean;
// System.out.println(emp);
return emp;
} else if (beanId.equals("person")) {
Person person = (Person) bean;
System.out.println(person);
return person;
} else
return null;
}
}
4.配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="emp01" class="com.life.Emp" init-method="init" destroy-method="destroy">
<property name="eid" value="15145101"></property>
<property name="ename" value="Bao Anyin"></property>
<property name="gender" value="nv"></property>
</bean>
<bean id="person" class="com.life.Person" init-method="init" destroy-method="destroy">
<property name="pname" value="Zhang San"></property>
</bean>
<bean class="com.life.PostProcessor"></bean>
</beans>
5.运行效果
6.总结
注意多个bean之间one、two、three等的前后顺序
i.通过构造器或工厂方法创建bean实例
ii.为bean的属性设置值和对其他bean的引用
iii.将bean实例传递给bean后置处理器的postProcessBeforeInitialization()方法
iv.调用bean的初始化方法
v.将bean实例传递给bean后置处理器的postProcessAfterInitialization()方法
vi.bean可以使用了
vii.当容器关闭时调用bean的销毁方法