SpringBoot 启动分析(六) — Bean 的创建过程

1. Bean 的创建过程

一个 bean 的创建过程我想用下面的图来表示:

2. bean 创建相关的核心扩展机制

2.1 InstantiationAwareBeanPostProcessor

BeanPostProcessor 的子接口,添加了 实例化前的回调,实例化后、但显式设置属性或自动注入前的回调。

通常用于抑制默认的对特定目标 bean 的初始化,例如给特定的 TargetSources(池化、延迟初始化的目标等)创建代理,或者用于实现额外的注入策略、例如字段注入。
(AnnotationAwareAspectJAutoProxyCreator 实现了该接口避免给特定的 bean 创建代理;AutowiredAnnotationBeanPostProcessor 实现了该接口用于实现 @Autowired/@Value 的字段/方法 注入)

注意:这个接口是个特殊目的的接口,主要用于框架内部。建议尽可能采用实现普通的 BeanPostProcessor 接口,或者继承自 InstantiationAwareBeanPostProcessorAdapter 以绕开对这个接口的扩展。

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

  /**
   * 在 bean 被实例化之前应用。返回的对象可能是个代理而不是目标 bean,有效 隐瞒了目标 bean 的默认创建。
   * 如果这个方法返回的是一个非 null 对象,bean的后续创建过程将被短路,只有 BeanPostProcessor.postProcessAfterInitialization 被应用。
   */
  Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;

  /**
   * 在 bean 被实例化(通过 构造器、工厂方法)后、Spring 设置属性之前执行一些操作。
   * 这是在 Spring 自动注入接入之前对给定 bean 实例执行定制的字段注入的理想回调钩子。
   */
  boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;

  /**
   * 后置处理给定的属性值,在 bean 工厂把它们应用到给定 bean 之前。允许检查所有的依赖是否都满足了。
   * 同时也允许替换要应用的属性值,通常是通过基于原始 PropertyValues 创建一个新的 MutablePropertyValues 实例,添加或移除特定的值。
   */
  PropertyValues postProcessPropertyValues(
      PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;

}

2.2 SmartInstantiationAwareBeanPostProcessor

InstantiationAwareBeanPostProcessor 接口的扩展,添加了一个回调用于预测处理的 Bean 的最终类型。

注意:这是个特殊目的的接口,主要用于框架内部。通常,应用提供的后置处理器应当简单实现普通的 BeanPostProcessor 接口或继承自 InstantiationAwareBeanPostProcessorAdapter 类。新的方法可能添加到这个接口。

public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
  /**
   * 预测给定 beanName 的最终 Bean 类型
   */
  Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException;

  /**
   * 确定给定 bean 的候选构造器
   */
  Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException;

  Object getEarlyBeanReference(Object bean, String beanName) throws BeansException;
}

2.3 MergedBeanDefinitionPostProcessor

merged bean definition,合并的 bean 定义,是原始 bean 定义的一个拷贝,Spring BeanFacotry 用来创建 bean 实例。

该接口是用于 合并的 bean 定义的 后置处理器接口。BeanPostProcessor 实现可能实现这个子接口以便 后置处理 合并的 bean 定义。

postProcessMergedBeanDefinition 方法可 内省(introspect) bean 定义以便在后置处理实际的 bean 实例之前准备一些元数据缓存。

创建代理;AutowiredAnnotationBeanPostProcessor 实现了该接口用于收集带有 @Autowired/@Value 注解的字符、方法,封装成注入元数据 InjectionMetadata 。

public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {
  void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);
}

欢迎关注我的微信公众号: coderbee笔记

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据