JAVA Spring应用手册-BeanPostProcessor接口_欢迎访问起点编程官网
欢迎访问起点编程官网
0519-86288177
13921547554

JAVA Spring应用手册-BeanPostProcessor接口

发布日期:2022-03-30 16:31:16 浏览次数:

BeanPostProcessor接口

[video(video-GuV1GhJZ-1606535142817)(type-bilibili)(url-player.bilibili.com/pla)(image-ss.csdn.net/p?)(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的实例化之后的处理:

JAVA  Spring应用手册-BeanPostProcessor接口(图1)

我相信从图中很容易就能看出来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));}

结果:

JAVA  Spring应用手册-BeanPostProcessor接口(图2)