Spring应用手册-BeanPostProcessor接口
程序员文章站
2024-03-24 15:52:58
...
戴着假发的程序员出品 抖音ID:戴着假发的程序员欢迎关注
BeanPostProcessor接口
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>
测试:
@Test
public 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));
}
结果:
推荐阅读
-
Spring应用手册-DisposableBean接口
-
Spring应用手册-BeanPostProcessor接口
-
Spring BeanPostProcessor接口使用详解
-
Spring BeanPostProcessor接口使用详解
-
Spring 中的 BeanPostProcessor接口
-
Spring应用手册--FactoryBean接口
-
springboot原理实战(3)-- spring扩展接口BeanPostProcessor,BeanFactoryPostProcessor
-
Gstreamer应用开发手册7:接口、时钟与同步
-
Spring应用手册--FactoryBean接口
-
spring中ApplicationContextAware接口的应用