Spring应用手册-BeanPostProcessor接口

戴着假发的程序员出品 抖音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));
}

结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴着假发的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值