Spring后处理Bean(BeanPostProcessor 接口)Bean增强

后处理Bean也称之为Bean的后处理器,作用是:在Bean初始化的前后,对Bean对象进行增强。它既可以增强一个指定的Bean,也可以增强所有的Bean,底层很多功能(如AOP等)的实现都是基于它的,Spring可以在容器中直接识别调用。

 

【示例】

要对“所有”的bean的初始化的时候进行增强(打印一句话)

第一步:创建MyBeanPostProcessor类,实现接口BeanPostProcessor

 

//后处理bean,:用来对bean进行功能增强,可以实现,对所有,或某个bean的初始化进行增强

public class MyBeanPostProcessor implements BeanPostProcessor{

 

    //初始化时(之前)调用的

    //参数1:bean对象,参数2,bean的名字,id、name

    public Object postProcessBeforeInitialization(Object bean, String beanName)

           throws BeansException {

//     System.out.println(beanName+"在初始化前开始增强了");

       //如何只增强一个bean

       if(beanName.equals("lifeCycleBean")){

           System.out.println(beanName+"在初始化前开始增强了");

       }

       return bean;//放行

    }

 

    //初始化时(之后)调用

    public Object postProcessAfterInitialization(Object bean, String beanName)

           throws BeansException {

//     System.out.println(beanName+"在初始化后开始增强了");

       if(beanName.equals("lifeCycleBean")){

           System.out.println(beanName+"在初始化后开始增强了");

       }

       return bean;

    }

 

}

第二步:定义applicationContext.xml文件

<!-- 后处理bean:spring在初始化MyBeanPostProcessor的时候,判断是否实现了BeanPostProcessor,如果实现了,就采用动态代理的方式,对所有的bean对象增强 -->

    <bean class="com.igeek.xmllifecycle.MyBeanPostProcessor"/>

 

执行任意bean操作的测试,控制台输出:

注意调用顺序。

BeanPostProcessor接口,提供增强途径,在不修改原来代码情况下,增添新的功能!

 

==========================================代码示例===============================================

 bean1

public class Bean1 {
	
	public Bean1() {
		System.out.println("Bean1-无参数的构造方法");
	}

	public void method() {
		System.out.println("bean1 - method");
	}
	
	/**
	 * 初始化方法, 方法名无所谓是什么
	 * 主要用于初始化相关数据
	 */
	public void init() {
		System.out.println("初始化Bean1");
	}
	/**
	 * 销毁Bean的方法,方法名无所谓
	 * 主要用于释放资源
	 */
	public void destroy() {
		System.out.println("销毁方法,释放资源");
	}
}

bean2

public class Bean2 {
	
	public Bean2() {
		System.out.println("Bean2-无参数的构造方法");
	}

	public void method() {
		System.out.println("bean2 - method");
	}
	
	/**
	 * 初始化方法, 方法名无所谓是什么
	 * 主要用于初始化相关数据
	 */
	public void init() {
		System.out.println("初始化Bean2");
	}
	/**
	 * 销毁Bean的方法,方法名无所谓
	 * 主要用于释放资源
	 */
	public void destroy() {
		System.out.println("bean2销毁方法,释放资源");
	}
}

MyBeanPostProcessor 实现接口:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
 * Bean的后处理器
 * @author Administrator
 *
 */
public class MyBeanPostProcessor implements BeanPostProcessor {

	/**
	 * bean对象被初始化之前执行的方法
	 * @param bean 要处理的bean的对象
	 * @param beanName 要处理的bean的名称或者ID
	 */
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.out.println(beanName+"初始化之前增强");
		return bean;
	}

	/**
	 * bean对象被初始化之后执行的方法
	 * @param bean 要处理的bean的对象
	 * @param beanName 要处理的bean的名称或者ID
	 */
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println(beanName+"初始化之后增强");
		return 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的生命周期 -->
<!-- 
过 init-method属性 指定初始化后的调用方法
通过 destroy-method属性 指定销毁对象前的方法 
 -->
<bean id="bean1" class="com.igeek.Bean1" scope="singleton" init-method="init" destroy-method="destroy"/>
<bean id="bean2" class="com.igeek.Bean2" scope="singleton" init-method="init" destroy-method="destroy"/>

<!-- 配置后置处理Bean -->
<bean class="com.igeek.MyBeanPostProcessor"/>

</beans>

test测试:

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanTest {
	
	ClassPathXmlApplicationContext context = null;
	@Before
	public void befor() {
		 context = new ClassPathXmlApplicationContext("applicationContext.xml");
	}
	
	@Test
	public void getBean1() {
		Bean1 bean1 = context.getBean(Bean1.class);
		bean1.method();
		bean1 = context.getBean(Bean1.class);
		bean1.method();
		bean1 = context.getBean(Bean1.class);
		bean1.method();
		bean1 = context.getBean(Bean1.class);
		bean1.method();
		//销毁容器的时候,会执行bean的destroy方法。
		context.close();
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值