2021-07-28阅读小笔记:Spring IOC 之 ApplicationContext初始化&扩展点

1、ApplicationContext 的初始化逻辑大致包含哪几个步骤?

  1. 初始化预处理
  2. 获取BeanFactory,加载所有Bean的定义信息(未实例化)
  3. BeanFactory的预处理配置
  4. 准备BeanFactory完成后进行的后置处理
  5. 执行BeanFactory创建后的后置处理器
  6. 注册Bean的后置处理器
  7. 初始化MessageSource
  8. 初始化事件派发器
  9. 子类的多态OnRefresh
  10. 注册监听器

----- 到此为止,beanFactory已经创建完成 ------

  1. 初始化所有剩下的单例Bean
  2. 完成容器的创建工作
  3. 清除缓存

2、在 ApplicationContext 的初始化过程中,都有哪些扩展点供我们开发者切入?分别针对的点又是什么?

扩展点我们可以从 BeanDefinition 和 Bean 两个方面入手。

BeanDefinition:

  1. @Import 注解 -> ImportSelector接口、ImportBeanDefinitionRegistrar 接口,我们可以利用 @Import 来指定导入实现了 ImportSelector接口和ImportBeanDefinitionRegistrar接口的类。其中 ImporSelector 是返回需要被注入容器的组件的全路路径名,所以这里不可以自定义 BeanDefinition;而 ImportBeanDefinitionRegistrar 中我们可以拿到 BeanDefinitionRegistry,从而可以注入自定义 BeanDefinition。

  2. BeanDefinitionRegistryPostProcessor -> BeanDefinitionRegistryPostProcessor 是 BeanFactoryPostProcessor 的子接口,它在 BeanFactoryPostProcessor 的基础上扩展了 postProcessBeanDefinitionRegistry 方法。这个方法中我们可以拿到 BeanDefinitionRegistry,因此也可以往IOC容器中注入新的 BeanDefinition,当然也可以获取和修改指定的 BeanDefinition。BeanDefinitionRegistryPostProcessor的优先级高于BeanFactoryPostProcessor。

  3. BeanFactoryPostProcessor -> BeanFactoryPostProcessor 提供了 postProcessBeanFactory 方法,这个方法中我们只能拿到 ConfigurableListableBeanFactory,即 BeanFactory,在这个阶段按理来讲不应该再向 BeanFactory 中注册新的 BeanDefinition 了,只能获取和修改现有的 BeanDefinition。

Bean:

  1. InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation -> InstantiationAwareBeanPostProcessor继承与 BeanPostProcessor,此方法执行于 Bean 实例化之前,方法参数有 Bean 的 Class 和 Name,因此我们可以拿到 Class 来做文章,例如返回一个代理类或者包装类;如果这个方法返回的是null,那么表示不进行拦截。

  2. SmartInstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation -> SmartInstantiationAwareBeanPostProcessor继承于 InstantiationAwareBeanPostProcessor,此方法生效于 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation 没生效,然后会选择和是的构造器去创建对象。这个在 SpringFramework 中并无使用,因为这个方法是没有被重写的。

  3. MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition -> 在Bean对象穿件之后,属性值注入之前,会调用此方法,这个方法主要用于收集 Bean 所属的 Class 中的注解信息。它在 Spring 中有三个关键的实现类,分别是 InitDestroyAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、和AutowiredAnnotationBeanPostProcessor,它们分别收集 @PostConstruct与@PreDestroy注解;JSR250注解,如@Resource;@Autowired和@Value 等自动注入相关注解

  4. InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation -> 又回到 InstantiationAwareBeanPostProcessor,它的 postProcessAfterInstantiation 返回结果是 Boolean 类型,它的主要用于判断是否继续走 populate 和 initializeBean 方法来初始化 Bean,默认返回 true。

  5. InstantiationAwareBeanPostProcessor#postProcessProperties -> 继续回到 InstantiationAwareBeanPostProcessor,这个方法主要用于给 Bean 对象对应的 PropertyVaules 中封装赋值和注入的数据应用给 Bean 实例。SpringFramework 中实现类是上面提到的 InitDestroyAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、和AutowiredAnnotationBeanPostProcessor,他们会在 postProcessProperties 方法中,将 MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition 中拿到的注解信息注入到 Bean 实例中。

  6. 最后还要提到父接口 BeanPostProcessor -> 它提供了俩方法,切入点分别是 Bean 对象初始化前后,方法分别是 postProcessBeforeInitialization 和 postProcessAfterInitialization。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值