述
在项目中,我们可以自定义一些 web 容器的配置,比如最常见的端口号,我们可以通过 server.port
配置,那么这些自定义的配置,是如何被应用到web容器中的, 下面来看一下 web 容器的个性化配置原理解析
源码解析
首先进入 createWebServer()
方法中
然后进入获取 WebServerFactory
的 getWebServerFactory()
方法
这里获取 WebServerFactory
的流程我们在上文分析过了,这里注意最后的创建 Bean 的方法, 我们之前在 Bean 实例化流程的部分了解到, Bean 实例化完成之后会循环所有的 BeanPostProcessor
的实现,调用其 postProcessBeforeInitialization()
方法, 如下
在这个地方,我们重点关注 WebServerFactoryCustomizerBeanPostProcessor
这个类
点进去他的 postProcessBeforeInitialization()
方法,看一下做了哪些事情
继续往下
这里就是先调用一个 getCustomizers()
方法,获取返回的集合, 然后循环集合,调用每个元素的 customize()
方法
getCustomizers()
一个一个看, 首先是 getCustomizers()
这个方法, 点进去
这里会调用 getWebServerFactoryCustomizerBeans()
这个方法,构建一个集合,然后排序返回,看一下这个方法里面是怎么处理的
这里会获取所有的 WebServerFactoryCustomizer
的实现,然后返回, 这里打一个断点,然后执行,看一下返回结果
这里一共有 5 个 WebServerFactoryCustomizer
的实现
先看一下第一个 TomcatWebSocketServletWebServerCustomizer
, 这个类是怎么被注入的,如下
这个类看着不太熟悉,没关系看下一个 ServletWebServerFactoryCustomizer
,看一下这个是什么时间被注入到容器中的
这个类看上去是不是就熟悉了, 就是上文中说的通过 @EnableAutoConfiguration
这个注解去注入的类
这里的 5 个 WebServerFactoryCustomizer
的实现都是通过这种方式注入的,其他就不一个个看了, 重点关注 ServletWebServerFactoryCustomizer
这个类
在上图中可以看到,这个类也是通过 @Bean
注解注入的,这里用到了一个参数就是 ServerProperties
,点进去看一下
这个是不是也很熟悉,就是一个配置类,我们在配置文件中配置的 server.port
就会被绑定到这个类里面
customize()
回过头来看 customize()
这个方法, 上面获取到 WebServerFactoryCustomizer
的实现之后,就会一次调用他们的 customize()
方法,还是先看 ServletWebServerFactoryCustomizer
这个类的 customize()
这里就是把 ServerProperties
里面的属性都赋值给 webFactory
再来看一个 TomcatWebServerFactoryCustomizer
和上面一样,也是把 ServerProperties
里面的 tomcat 相关配置赋值给 webFactory
其他几个做的事情大致都是这样, 到这儿就知道了整个web个性化配置生效的原理了
总结
属性注入流程
个性化配置生效流程
举例 ServletWebServerFactoryCustomizer
的处理流程