Spring Boot-21-web个性化配置原理解析

在项目中,我们可以自定义一些 web 容器的配置,比如最常见的端口号,我们可以通过 server.port 配置,那么这些自定义的配置,是如何被应用到web容器中的, 下面来看一下 web 容器的个性化配置原理解析

源码解析

首先进入 createWebServer() 方法中

image

然后进入获取 WebServerFactorygetWebServerFactory() 方法

image

这里获取 WebServerFactory 的流程我们在上文分析过了,这里注意最后的创建 Bean 的方法, 我们之前在 Bean 实例化流程的部分了解到, Bean 实例化完成之后会循环所有的 BeanPostProcessor 的实现,调用其 postProcessBeforeInitialization() 方法, 如下

image

在这个地方,我们重点关注 WebServerFactoryCustomizerBeanPostProcessor 这个类

image

点进去他的 postProcessBeforeInitialization() 方法,看一下做了哪些事情

image

继续往下

image

这里就是先调用一个 getCustomizers() 方法,获取返回的集合, 然后循环集合,调用每个元素的 customize() 方法

getCustomizers()

一个一个看, 首先是 getCustomizers() 这个方法, 点进去

image

这里会调用 getWebServerFactoryCustomizerBeans() 这个方法,构建一个集合,然后排序返回,看一下这个方法里面是怎么处理的

image

这里会获取所有的 WebServerFactoryCustomizer 的实现,然后返回, 这里打一个断点,然后执行,看一下返回结果

image

这里一共有 5 个 WebServerFactoryCustomizer 的实现

先看一下第一个 TomcatWebSocketServletWebServerCustomizer, 这个类是怎么被注入的,如下

image

这个类看着不太熟悉,没关系看下一个 ServletWebServerFactoryCustomizer ,看一下这个是什么时间被注入到容器中的

image

这个类看上去是不是就熟悉了, 就是上文中说的通过 @EnableAutoConfiguration 这个注解去注入的类

这里的 5 个 WebServerFactoryCustomizer 的实现都是通过这种方式注入的,其他就不一个个看了, 重点关注 ServletWebServerFactoryCustomizer 这个类

在上图中可以看到,这个类也是通过 @Bean 注解注入的,这里用到了一个参数就是 ServerProperties ,点进去看一下

image

这个是不是也很熟悉,就是一个配置类,我们在配置文件中配置的 server.port 就会被绑定到这个类里面

customize()

回过头来看 customize() 这个方法, 上面获取到 WebServerFactoryCustomizer 的实现之后,就会一次调用他们的 customize() 方法,还是先看 ServletWebServerFactoryCustomizer 这个类的 customize()

image

这里就是把 ServerProperties 里面的属性都赋值给 webFactory

再来看一个 TomcatWebServerFactoryCustomizer

image

和上面一样,也是把 ServerProperties 里面的 tomcat 相关配置赋值给 webFactory

其他几个做的事情大致都是这样, 到这儿就知道了整个web个性化配置生效的原理了

总结

属性注入流程

image

个性化配置生效流程

image

举例 ServletWebServerFactoryCustomizer 的处理流程

image