主要是总结一下最近看spring源码的学习到的经验,这一部分是springboot中对server配置内容是怎么初始化到代码中。
springboot使用的版本是2.0.4.RELEASE
1.第一部分是将配置文件中的配置信息加载到TomcatServletWebServerFactory 工厂类中。整个流程图如下:
1.1WebServerFactoryCustomizerBeanPostProcessor 类
implement BeanPostProcessor ,实现 postProcessBeforeInitialization();
BeanPostProcessor 这个接口是spring提供的接口,只要类实现了这个接口,并实现其中的两个方法就可以再spring 容器初始化所有的bean对象之前和之后进行一些操作。WebServerFactoryCustomizerBeanPostProcessor 的源码如下:
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof WebServerFactory) {
postProcessBeforeInitialization((WebServerFactory) bean);
}
return bean;
}
其中的postProcessBeforeInitialization(WebServerFactory webServerFactory) 会从spring容器中获取到所有的WebServerFactoryCustomizer对象,并调用他们的customize(webServerFactory);
1.2ServletWebServerFactoryCustomizer
customize(ConfigurableServletWebServerFactory factory)主要是将ServerProperties类中获取到的配置信息转换到factory类中。
public void customize(ConfigurableServletWebServerFactory factory) {
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
map.from(this.serverProperties::getPort).to(factory::setPort);
...
}
2.通过TomcatServletWebServerFactory 获取到WebContext
2.1 ServletWebServerApplicationContext:就是应用的applicationContext对象 ,保存一个WebServer对象。
@Override
protected void onRefresh() {
super.onRefresh();
try {
createWebServer();
}
catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
3.其中用到设计思想。
3.1模板方法
模板方法主要用于一些有通用的流程,但是有不同的实现方的场合。接口声明通用的流程或者规范。抽象类中有通用的实现,实现类中定制的一些内容。
3.2processor设计
WebServerFactoryCustomizerBeanPostProcessor
这个类就体现了这种模式设计,从spring容器中获取所有的WebServerFactoryCustomizer的实现,并排序,然后根据集合中的顺序,依次调用,跟责任链模式的功能是一样的,但是语义上没有链式调用。