写点什么

Spring Bean 处理器

用户头像
TinyKing
关注
发布于: 2020 年 09 月 01 日
Spring Bean处理器

在本文中,我们将研究分析下 Spring 的 bean 处理器是如何工作的。

Spring Bean 处理器提供了灵活的机制,方便我们在 Bean 初始化前和初始化后对 Bean 做一些特殊的处理。

Spring Bean 处理器负责处理 Spring IoC 容器中每一个可用的 Bean 实例。

介绍

在开发详细研究 Spring Bean 处理器之前,我们先通过图解的方式,直观的了解一下 Spring Bean 在 Spring Bean 初始化过程中具体的位置:


Spring Bean 的整个生命周期如下:

  1. Spring 从 xml 中,或者是 classpath 中加载 bean 定义

  2. 将得到的 bean 定义添加到 BeanFactory 中

  3. 在创建 bean 的过程中,Spring 的 DI 就会如上图所示处理 Bean 的依赖关系

  4. BeanPostProcessor 可以让开发在 bean 的初始化前、后增加一些额外的处理逻辑

  5. Bean 创建并初始化完成,等待程序去使用

Spring BeanPostProcessor

Spring BeanPostProcessor 是一个工厂钩子,允许对新 bean 进行修改。在 BeanPostProcessor 接口中定义了两个方法:

  • postProcessAfterInitialization:在任何 bean 初始化回调之后,将此 BeanPostProcessor 应用到给定的新 bean 实例。

  • postProcessBeforeInitialization:在任何 bean 初始化之前,对给定的新 bean 实例应用这个 BeanPostProcessor。

接下来,我们通过一个例子来更好的理解下 BeanPostProcessor:

public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Calling bean post processor before init for bean:: "+beanName + "class name: "+bean.getClass()); return bean; }
@Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Calling bean post processor after init for bean:: "+beanName + "class name: "+bean.getClass()); return bean; }}
复制代码

Spring 会将所有 bean 的创建都经过 CustomBeanPostProcessor 处理一遍。

注册 Bean 处理器

在 Spring 中注册 Bean 处理器的方法非常简单,只要将该处理器声明成一个 Spring Bean 就可以了:

@Componentpublic class CustomBeanPostProcessor implements BeanPostProcessor {
@Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Calling bean post processor before init for bean:: "+beanName + "class name: "+bean.getClass()); return bean; }
@Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Calling bean post processor after init for bean:: "+beanName + "class name: "+bean.getClass()); return bean; }}
复制代码

总结

通过了解了 Bean 处理器是如何工作的,可以让我们在实际的开发过程更方便的实现一些特殊的处理需求,而不必侵入 Bean 类中


用户头像

TinyKing

关注

风轻云淡~ 2018.03.21 加入

公众号:Java码农

评论

发布
暂无评论
Spring Bean处理器