欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的实例化之后的处理:
Spring应用手册-BeanPostProcessor接口
我相信从图中很容易就能看出来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应用手册-BeanPostProcessor接口