转载

Spring系列六:Spring BeanPostProcessor

bean 后处理器允许自定义修改 spring bean factory 创建的新 bean 实例。如果你想在 Spring 容器完成实例化、配置和初始化 bean 之后实现一些定制逻辑,我们可以插入一个或多个 BeanPostProcessor 实现。

如果有多个 BeanPostProcessor 实例,我们可以通过设置 order 属性或实现 Ordered 接口来控制执行顺序。

Spring BeanPostProcessor

BeanPostProcessor 接口由两个回调方法组成,即 postprocessbeforeinitialize()postprocessafterinitialize()

对于由容器创建的每个 bean 实例,后处理器都会在调用容器初始化方法之前以及在任何bean初始化回调之后都从容器获得回调。

bean 后处理器通常检查回调接口,或者使用代理包装 bean 。例如一些 Spring AOP 基础结构类(例如 AbstractAdvisingBeanPostProcessor )实现了 bean 后处理器,提供代理包装逻辑。

如何创建 BeanPostProcessor

spring 中创建一个 bean 后处理器:

BeanPostProcessor
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
 
public class CustomBeanPostProcessor implements BeanPostProcessor
{
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
    {
        System.out.println("Called postProcessBeforeInitialization() for :" + beanName);
        return bean;
    }
     
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
    {
        System.out.println("Called postProcessAfterInitialization() for :" + beanName);
        return bean;
    }
}
复制代码

如何注册 BeanPostProcessor

ApplicationContext 自动检测实现 BeanPostProcessor 接口的配置元数据中定义的所有 bean 。它将这些 bean 注册为后处理器,以便以后在创建 bean 时调用它们

然后 Spring 将在调用初始化回调方法之前和之后将每个 bean 实例传递给这两个方法,在这两个方法中,你可以按自己喜欢的方式处理 bean 实例。

<beans>
     <bean id="customBeanPostProcessor"
               class="com.howtodoinjava.demo.processors.CustomBeanPostProcessor" />
</beans>
复制代码

BeanPostProcessor 被调用方法时

通常, springDI 容器会执行以下操作来创建一个 bean

  1. 通过构造函数或工厂方法重新创建 bean 实例
  2. 设置属性值值和对其它 bean 的引用
  3. 调用所有 *Aware 接口中定义的 setter 方法
  4. bean 实例传递给每个 bean 后处理器的 postProcessBeforeInitialization() 方法
  5. 调用初始化回调方法
  6. Bean 实例传递到每个 Bean 后处理器的 postProcessAfterInitialization() 方法
  7. 这个 bean 已经可以被使用了
  8. 当容器关闭时,调用销毁回调方法

Spring BeanPostProcessor 示例

为了展示示例用法,我使用了 EmployeeDAOImpl 类,如下所示:

public class EmployeeDAOImpl implements EmployeeDAO
{
    public EmployeeDTO createNewEmployee()
    {
        EmployeeDTO e = new EmployeeDTO();
        e.setId(1);
        e.setFirstName("Lokesh");
        e.setLastName("Gupta");
        return e;
    }
     
    public void initBean() {
        System.out.println("Init Bean for : EmployeeDAOImpl");
    }
     
    public void destroyBean() {
        System.out.println("Init Bean for : EmployeeDAOImpl");
    }
}
复制代码

bean 及其后处理器的配置如下:

<bean id="customBeanPostProcessor" class="com.howtodoinjava.demo.processors.CustomBeanPostProcessor" />
     
<bean id="dao" class="com.howtodoinjava.demo.dao.EmployeeDAOImpl"  init-method="initBean" destroy-method="destroyBean"/>
复制代码

现在,启动 DI 容器并查看输出:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
复制代码

输出:

Called postProcessBeforeInitialization() for : dao
Init Bean for : EmployeeDAOImpl
Called postProcessAfterInitialization() for : dao
复制代码

很显然,在初始化方法之前和之后调用了BeanPostProcessor方法。

原文链接: Spring BeanPostProcessor Example

原文  https://juejin.im/post/5db0fa075188256499774077
正文到此结束
Loading...