Spring的BeanPostProcessor

Posted 只有睿智的河水知道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring的BeanPostProcessor相关的知识,希望对你有一定的参考价值。

一、BeanPostProcessor接口的作用

如果我们需要在Spring容器完成Bean的实例化、配置和其他的初始化前后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现,然后注册到容器中去。

 

二、如何实现BeanPostProcessor接口

BeanPostProcessor有两个方法需要实现:postProcessorAfterInitialization、postProcessorBeforeInitialization。

Java代码:

import org.springframework.beans.factory.config.BeanPostProcessor;
public class TestBeanPostProcessor implements BeanPostProcessor {

    /**
     * 实例化之后进行处理
     */
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    /**
     * 实例化之前进行处理
     */
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

前者在初始化代码调用之后调用。

后者在实例化及依赖注入完成后,在任何初始化代码(比如配置文件中的init-method)调用之前调用。

 

三、BeanFactory和ApplicationContext对待bean后置处理器稍有不同

1. ApplicationContext会自动检测在配置文件中实现了BeanPostProcessor接口的所有bean。并把他们注册为后置处理器,然后在容器创建bean的适当时候调用它。因此部署一个后置处理器同部署其他bean并没有什么区别。

<bean class="TestBeanPostProcessor" />

2. 而使用BeanFactory实现的时候,bean后置处理器必须通过代码显式的去注册,在IOC容器集成体系中ConfingurableBeanFactory接口中定义了注册方法。

例如:

TestBeanPostPrcessor beanPostProcessor = new TestBeanPostPrcessor();
Resource resource = new FileSystemResource("applicationContext.xml");
ConfigurableBeanFactory factory = new XmlBeanFactory(resource);
factory.addBeanPostProcessor(beanPostProcessor);
factory.getBean("logic");

 

注意:

1. 接口中的两个方法都要将传入的bean返回、而不能返回Null。否则getBean将无法取得目标。

2. 如将BeanPostProcessor标记为延迟初始化,则无法注册,自定义逻辑也就无法得到应用。假如你在<beans/>元素的定义中使用了‘default-lazy-init‘属性,则各个BeanPostProcessor需标记为‘lazy-init="false"‘。

 

以上是关于Spring的BeanPostProcessor的主要内容,如果未能解决你的问题,请参考以下文章

Ioc容器-BeanPostProcessor-Spring 源码

Spring 的 BeanPostProcessor接口实现

spring源码之BeanPostProcessor

Spring点滴五:Spring中的后置处理器BeanPostProcessor讲解

Spring中的后置处理器BeanPostProcessor讲解

Spring源码解析之BeanPostProcessor