JAVA Spring应用手册-BeanPostProcessor接口
发布日期:2022-03-30 16:31:16 浏览次数:
BeanPostProcessor接口
[video(video-GuV1GhJZ-1606535142817)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=755049615&page=13)(image-https://ss.csdn.net/p?http://i0.hdslb.com/bfs/archive/c311e8b9388bb456738b871407ede9a228f6f31a.jpg)(title-spring应用手册(第五部分))] BeanPostProcessor称之为bean的后置处理器,在spring容器初始化时就大量的使用了这个接口的对象。
先看看源码:
public interface BeanPostProcessor {
//bean初始化方法调用前被调用 Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
//bean初始化方法调用后被调用 Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;}
这个接口中有两个方法,两个方法的执行时间我已经在代码中注明。
这里我们再看一个springbean的加载流程图,注意这部分主要是bean的实例化之后的处理:

我相信从图中很容易就能看出来BeanPostProcessor的两个方法分别是在bean的初始化之前和之后执行的。
我们再看看这两个方法的参数:Object bean, String beanName。分别是实例对象和beanName。我们可以根据我们的需求对实例对象进行修改和调整。
我们看一个使用方法的案例:我们在前置处理中将coder的对象修改为manager的对象。
我们自己定义一个DkBeanPostProcess实现接口BeanPostProcessor:
/** * @author 戴着假发的程序员 * @company http://www.boxuewa.com * @description */public class DkBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//判断beanName是否是coder if(beanName.equals("coder")){
System.out.println("前置处理中将coder修改为manager对象");
//如果是,就将bean修改为Manager bean = new Manager();
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(beanName.equals("coder")){
System.out.println("后置处理中检查类型是否是Coder:"+(bean instanceof Coder));
System.out.println("后置处理中检查类型是否是Manager:"+(bean instanceof Manager));
}
return bean;
}}
配置,注意我们只需要将BeanPostProcessor注册在Spring中即可,spring会自动执行。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置我们的DkBeanPostProcessor -->
<!-- 这里注意,我们只要将这个Bean交给spring即可,不需要id -->
<bean class="com.st.dk.demo10.beanpostprocessor.DkBeanPostProcessor"/>
<!-- 正常配置colder -->
<bean id="coder" class="com.igeek.dk.demo10.beans.Coder"/></beans>
测试:
@Testpublic void testBeanPostProcessor(){
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext-demo10.xml");
Object coder = ac.getBean("coder");
System.out.println("是否是Coder的实例:"+(coder instanceof Coder));
System.out.println("是否是Manager的实例:"+(coder instanceof Manager));}
结果:
