spring-boot源码分析之BeanFactory · 柒

云中志

共 1679字,需浏览 4分钟

 ·

2021-09-12 22:00

前言

今天继续看refresh方法,今天的目标是搞定三个方法:

  • obtainFreshBeanFactory
  • prepareBeanFactory
  • postProcessBeanFactory

但是下午突然有事把我的计划打乱了,剩下的内容还没有补充进去,我又不想打断自己的计划,索性就先发一部分,剩余内容后续完善后再更新。

下面我们就先来简单看下吧!

refresh

obtainFreshBeanFactory

这个方法的实际作用就是获取beanFactory,其内部调用流程如下:

首先,它的内部调用了AbstractApplicationContextrefreshBeanFactory方法,由于在我们当前容器AnnotationConfigServletWebServerApplicationContext的所有父类(或者父类的父类)中,只有GenericApplicationContext重写了这个方法,所以实际调用的是GenericApplicationContextrefreshBeanFactory

refreshBeanFactory方法中其实就做了两件事,一个是设置refreshed的值,这里用到了javaCAS机制,是线程安全的一个机制,如果实际值与预期值(expect)一致,则将值设置为更新值(update),这一块属于多线程线程安全领域的内容;另一个操作就是设置beanFactoryserializationId,这个值默认设置的是spring.application.name的值。

prepareBeanFactory

这个方法内部实际就进行了下面几种操作:

  • 设置BeanFactory的参数,包括beanClassLoader(类加载器)、BeanExpressionResolver(表达式解析器)、TempClassLoader(临时类加载器);

  • beanFactory中添加了一些组件,包括PropertyEditorRegistrar(属性编辑注册器)、BeanPostProcessor(后置处理器);

  • 忽略接口依赖的操作;

  • 注册依赖的操作;

  • 最后,往beanFactory中注册了环境相关的bean

    postProcessBeanFactory

    关于这个方法官方注释给出如下说明:

    Modify the application context's internal bean factory after its standard initialization. All bean definitions will have been loaded, but no beans will have been instantiated yet. This allows for registering special BeanPostProcessors etc in certain ApplicationContext implementations.

    意思就是说,这个方法是在标准初始化之后,修改应用容器的内部beanFactory,这时候,所有bean定义都已加载,但尚未实例化任何bean,是允许往容器中注册特殊的BeanPostProcessor的。所以这个方法其实就是在bean实例化前,往beanFactory中注册BeanPostProcessorbean后置处理器)。

总结

今天由于一些特殊情况,我的原有计划又被打乱了,有点无语,但是事情撂给我了,我也不能撒手不管,所以今天只能先到这里。

虽然三个方法也算分析完了,但是原本更细致的内容还没来得及剖析,好多内容都没来得及剖析,剩余的内容,我明后两天再抽时间完善下,届时再重新分享。

好了,各位小伙伴,晚安哦!

- END -


浏览 35
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报