Spring框架总结五---bean生命周期后置处理器

一.生命周期

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的销毁方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值