前言
上一篇讲了spring
容器初始化流程中的beanFactory
预处理。那这一篇将对beanFactory
的后置处理进行整理。
其实spring
的启动过程是有很多流程的,也是很复杂的,我只是根据自己的思路和理解来进行整理的,肯定就会忽略一些自认为不重要的或者是自己没有发现的地方。也希望xdjmm能够多多指正。
正文
依赖的pom:
1 |
|
本篇文章将要说的一个流程就是:
1 |
|
postProcessBeanFactory
进入postProcessBeanFactory
方法,发现该方法是一个空方法,什么也没做,不过根据该方法的注释翻译:
1 |
|
从注释可以知道,postProcessBeanFactory
就是对BeanFactory
进行后置处理,也就是在BeanFactory
完成初始化后可以对其进行一些修改,具体要做什么,就看子类怎么去实现的了。
由于我只导入了spring-context
包,里面对该方法的实现是没有的,不过可以在springboot
项目中去查看该方法在子类中是如何去实现的。
这里需要注意的是,我使用的springboot
的版本是2.5.2
,不同版本的代码可能是不一样的。
下面对其中的一个子类代码进行讲解:
1 |
|
AnnotationConfigServletWebServerApplicationContext
的父类是ServletWebServerApplicationContext
,
下面看看父类中的postProcessBeanFactory
方法是怎么样的。
1 |
|
在父类的方法中主要就是做了两件事:
- 向
BeanFactory
中注册一个PostProcessor
,也就是注册一个WebApplicationContextServletContextAwareProcessor
registerWebApplicationScopes
,把方法名翻译过来就是注册web
应用的作用域。
WebApplicationContextServletContextAwareProcessor
类的注释:
1 |
|
注解中说明了是ServletContextAwareProcessor
,那么看看ServletContextAwareProcessor
类的注释:
1 |
|
ServletContextAwareProcessor
实现了BeanPostProcessor
接口,
那么这里就定位至他的postProcessBeforeInitialization
方法和postProcessAfterInitialization
方法
1 |
|
代码也比较简单,就是判断当前bean
是ServletContextAware
的实现还是ServletConfigAware
的实现,然后分别转换后再调用各自接口的实现方法。
ServletContextAware
的实现类就是调用setServletContext
方法。
ServletConfigAware
的实现类就是调用setServletConfig
方法。
扩展:
这里涉及到了BeanPostProcessor
和XXXAware
接口,这两种接口的基本使用这里就不细说了;
这里的大概流程就是:向容器注册BeanPostProcessor
的一个实现,然后该实现类是处理XXXAware
接口的实现类实现的方法。
其实自己也可以根据这个模板来进行自定义XXXAware
接口的扩展,当然也可以进行其他的一些处理,总之就是BeanPostProcessor
提供了很好的扩展性,这里只是其中的一种方式。
registerWebApplicationScopes
这个方法主要就是向beanFactory中注册作用域:(“request”, “session”, “globalSession”, “application”),在源码分析:
该方法的源码如下:
1 |
|
ExistingWebApplicationScopes是ServletWebServerApplicationContext类中的一个静态类。源码如下:
1 |
|
WebApplicationContextUtils.registerWebApplicationScopes(),这个方法就是向beanFactory注册web的scope了,源码如下:
1 |
|
这个方法也比较简单,主要注册了几种注册域request ,session ,application。
最后
至此,org.springframework.context.support.AbstractApplicationContext.postProcessBeanFactory 这个方法的大概流程就讲完了,这个方法主要就是做了两点:
- 向容器注册WebApplicationContextServletContextAwareProcessor,用来处理ServletContextAware和ServletConfigAware的实现类
- 注册作用域,request,session,application