所谓的bean处理器是指对容器中所有的bean进行处理,得到一个增强的bean
bean处理器是一个实现了BeanPostProcessor接口的bean。
BeanPostProcessor接口中有如下两个default方法可以重写
-
Object postProcessBeforeInitialization(Object bean, String beanName)
在bean初始化之前对bean处理的方法 -
Object postProcessAfterInitialization(Object bean, String beanName)
在bean刚初始化之后对bean处理的方法
示例:(修改Dog示例的成员变量)
为了演示bean处理器触发时机,在Dog类中添加了生命周期方法
public class Dog implements InitializingBean
{
private String name;
private String color;
public void born()
{
System.out.println("--------------Dog初始化完成:调用方法born--------------");
}
@Override
public void afterPropertiesSet() throws Exception
{
System.out.println("--------------Dog初始化完成:调用方法afterPropertiesSet--------------");
}
//省略getter、setter方法
}
public class LiveProcesses implements BeanPostProcessor
{
//bean初始化前处理器
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
{
if (bean instanceof Dog)
{
try {
Class clazz = bean.getClass();
Field f = clazz.getDeclaredField("name");
f.setAccessible(true);
f.set(bean,"【bean初始化前处理器增加的前缀】" + f.get(bean));
} catch (Exception e) {
e.printStackTrace();
}
}
return bean;
}
//bean初始化后处理器
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
{
if (bean instanceof Dog)
{
try {
Class clazz = bean.getClass();
Field f = clazz.getDeclaredField("color");
f.setAccessible(true);
f.set(bean,"【bean初始化后处理器增加的前缀】" + f.get(bean));
} catch (Exception e) {
e.printStackTrace();
}
}
return bean;
}
}
<!--注册bean处理器-->
<bean class="com.lyx.factory.LiveProcesses" />
<bean id="dog" class="com.lyx.service.Dog" init-method="born"
p:name="点点"
p:color="黑白相间"/>
驱动程序
public class Driver
{
public static void main(String[] args)
{
var ctx = new ClassPathXmlApplicationContext("beans.xml");
var dog = (Dog)ctx.getBean("dog");
var name = dog.getName();
System.out.println("name = " + name);
var color = dog.getColor();
System.out.println("color = " + color);
//输出:
//--------------初始化完成:调用方法afterPropertiesSet--------------
//--------------初始化完成:调用方法born--------------
//name = 【bean初始化前处理器增加的前缀】点点
//color = 【bean初始化后处理器增加的前缀】黑白相间
}
}