Springboot Web应用中服务器配置参数ServerProperties的加载
#概述
Springboot配置文件中以server开头的项表示服务器的配置参数,这一点从字面意义即可直观理解,这些参数,包括端口,路径设置,SSL配置参数等等。具体有哪些参数,从源代码的角度上,可以参考类ServerProperties的定义,它位于包 org.springframework.boot.autoconfigure.web 中。
服务器配置参数的加载,Springboot应用中是通过其自动配置机制来实现的,下面就具体分析其过程。
#自动配置定义服务器配置参数加载工具
EmbeddedServletContainerAutoConfiguration注册bean EmbeddedServletContainerCustomizerBeanPostProcessor
EmbeddedServletContainerAutoConfiguration是Springboot的自动配置类,位于包
package org.springframework.boot.autoconfigure.web
这个配置类以内部类的形式定义了一个ImportBeanDefinitionRegistrar并通过@Import注解导入,而该导入会引起向容器注册一个Bean embeddedServletContainerCustomizerBeanPostProcessor。
// 该代码引用略去与本主题无关部分
@Configuration
@ConditionalOnWebApplication
@Import(BeanPostProcessorsRegistrar.class)//内部类BeanPostProcessorsRegistrar导入
public class EmbeddedServletContainerAutoConfiguration {// 内部类BeanPostProcessorsRegistrar定义public static class BeanPostProcessorsRegistrarimplements ImportBeanDefinitionRegistrar, BeanFactoryAware {
@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {if (this.beanFactory == null) {return;}// 注册bean embeddedServletContainerCustomizerBeanPostProcessor,// 对应类 EmbeddedServletContainerCustomizerBeanPostProcessor.classregisterSyntheticBeanIfMissing(registry,"embeddedServletContainerCustomizerBeanPostProcessor",EmbeddedServletContainerCustomizerBeanPostProcessor.class);} }
}
关于上面ImportBeanDefinitionRegistrar的执行时机,可以参考 :
ConfigurationClassBeanDefinitionReader 是如何工作的 ?
Bean embeddedServletContainerCustomizerBeanPostProcessor对应类为
EmbeddedServletContainerCustomizerBeanPostProcessor,该类实现了 BeanPostProcessor, BeanFactoryAware 两个接口。
该bean embeddedServletContainerCustomizerBeanPostProcessor的用途是把Bean容器中注册的所有EmbeddedServletContainerCustomizer bean应用到ConfigurableEmbeddedServletContainer。而在基于tomcat的Springboot Web应用中,这里会是一个TomcatEmbeddedServletContainerFactory 。
ServerPropertiesAutoConfiguration定义服务器配置参数加载工具Bean serverProperties
ServerPropertiesAutoConfiguration是Springboot的另外一个自动配置类,位于包
package org.springframework.boot.autoconfigure.web
它定义了bean serverProperties,对应实现类ServerProperties,这是负责加载服务器配置参数的工具类。
// 该代码引用略去与本主题无关部分
@Configuration
@EnableConfigurationProperties
@ConditionalOnWebApplication
public class ServerPropertiesAutoConfiguration {// 定义加载服务器配置参数的工具bean@Bean@ConditionalOnMissingBean(search = SearchStrategy.CURRENT)public ServerProperties serverProperties() {return new ServerProperties();}
ServerProperties读取服务器配置参数
ServerProperties是springboot的自动配置autoconfigure工具,位于包
org.springframework.boot.autoconfigure.web
该类用于提供服务器的端口,路径,SSL等参数设置,它实现了接口EmbeddedServletContainerCustomizer,是专门设计给EmbeddedServletContainerCustomizerBeanPostProcessor用来定制EmbeddedServletContainerFactory实例的。
ServerProperties在容器启动时会被作为bean定义注册到容器,在容器启动过程中应用EmbeddedServletContainerCustomizerBeanPostProcessor的阶段,ServerProperties bean会被实例化,此时配置文件会被该bean读取。
具体的执行入口点如下 :
SpringApplication.run()=> refreshContext()=> EmbeddedWebApplicationContext.refresh()=> onRefresh() => createEmbeddedServletContainer()=> getEmbeddedServletContainerFactory()=> AbstractBeanFactory.getBean("tomcatEmbeddedServletContainerFactory")=> doGetBean()=> DefaultSingletonBeanRegistry.getSingleton() => AbstractAutowireCapableBeanFactory.doCreateBean()=> initializeBean() // 此时Bean已经实例化,并且已经填充能从容器中获得的属性=> applyBeanPostProcessorsBeforeInitialization()// 此时被已经调用aware方法
上面的方法applyBeanPostProcessorsBeforeInitialization()会在当前bean上面尝试应用所有注册到容器的BeanPostProcessor。
// 实现在 AbstractAutowireCapableBeanFactory 中
// 对existingBean应用所有BeanPostProcessor ,从以下逻辑可以看出,此时尚不区分某个
// BeanPostProcessor对bean existingBean是否可以真正执行,这个判断逻辑,交给具体的
// BeanPostProcessor实现来完成
@Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {result = beanProcessor.postProcessBeforeInitialization(result, beanName);if (result == null) {return result;}}return result;}
BeanPostProcessor bean EmbeddedServletContainerCustomizerBeanPostProcessor 发现bean tomcatEmbeddedServletContainerFactory是其目标应用对象,所以就会将自己的方法postProcessBeforeInitialization()针对其执行:
// 类EmbeddedServletContainerCustomizerBeanPostProcessor的方法实现// 类EmbeddedServletContainerCustomizerBeanPostProcessor实现了BeanPostProcessor接口@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {if (bean instanceof ConfigurableEmbeddedServletContainer) {postProcessBeforeInitialization((ConfigurableEmbeddedServletContainer) bean);}return bean;}// 将所有的customizer应用到目标bean上// 从上面的分析已经知道ServerProperties就是一个// EmbeddedServletContainerCustomizer,所以在这个方法执行时,bean serverProperties// 会将服务器配置参数设置到目标内置servlet容器private void postProcessBeforeInitialization(ConfigurableEmbeddedServletContainer bean) {for (EmbeddedServletContainerCustomizer customizer : getCustomizers()) {customizer.customize(bean);}} // 所有的customizer是容器中类别为EmbeddedServletContainerCustomizer的bean定义,// 这里获取并实例化它们,从上面的分析已经知道ServerProperties是一个// EmbeddedServletContainerCustomizer,所以在下面方法执行时,bean ServerProperties就会被// 实例化,相应的服务器配置参数会被加载进来private Collection<EmbeddedServletContainerCustomizer> getCustomizers() {if (this.customizers == null) {// Look up does not include the parent contextthis.customizers = new ArrayList<EmbeddedServletContainerCustomizer>(this.beanFactory.getBeansOfType(EmbeddedServletContainerCustomizer.class,false, false).values());Collections.sort(this.customizers, AnnotationAwareOrderComparator.INSTANCE);this.customizers = Collections.unmodifiableList(this.customizers);}return this.customizers;}
Springboot Web应用中服务器配置参数ServerProperties的加载相关推荐
- java懒加载注解_在springboot中实现个别bean懒加载的操作
懒加载---就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中. @Lazy 在需要懒加载的bean上加上@Lazy ...
- 【Web】解决简书图片不显示问题“系统维护中,图片暂时无法加载”
个人博客: http://www.milovetingting.cn 简书不显示图片的解决方法 首次编辑于2019-6-6 最近几天在浏览简书上的文章时,发现图片显示不出来,提示"系统维护中 ...
- web.xml的contextConfigLocation作用及自动加载applicationContext.xml
web.xml的contextConfigLocation作用及自动加载applicationContext.xml 转自:http://blog.csdn.net/sapphire_aling/ar ...
- 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3
备注: 因为文章太长,所以将它分为三部分,本文是第三部分. 第一部分:深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1 第二部分:深入浅出经典面试题:从浏览器中输入URL ...
- 在 Swift 中使用闭包实现懒加载
本文讲的是在 Swift 中使用闭包实现懒加载, 原文地址:Swift Lazy Initialization with Closures 原文作者:Bob Lee 译文出自:掘金翻译计划 译者:ls ...
- 如何在React Native中创建精美的动画加载器
by Vikrant Negi 通过Vikrant Negi 如何在React Native中创建精美的动画加载器 (How to create a beautifully animated load ...
- fetchtype 动态控制_hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法
对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,使得Hi ...
- uboot加载linux内核加载那些内容,几个地址参数及uboot加载启动内核过程的理解
关于uBoot和Linux内核中几个地址参数及uboot加载启动内核过程的理解 uboot一般使用mkimage工具先制作一个启动映象文件来引导识别内核的,uboot源代码的tools/目录下有mki ...
- Unity中使用代码将预制加载到场景
Unity中使用代码将预制加载到场景 大家知道, 在日常修改预制的时候很方便, 我们将预制从资源文件夹往场景上"一拖", 然后就可以进行修改, 然后应用保存即可. 但是如果某些需求 ...
最新文章
- 【Appium】Appium+Python环境搭建
- 孩子听不进道理怎么办?
- 我的世界服务器如何修改加载规模,我的世界服务器预加载区域怎么调小
- DPDK源码编译(二十八)
- leetcode 24. Swap Nodes in Pairs | 24. 两两交换链表中的节点(Java)
- python列表的加法_Python列表加法理解
- jQuery中的日期时间控件
- win10系统cpu内核或逻辑核心缺少缺少,解决办法
- Reaction of travel book-ShanXi
- 计算机一级网址打不开怎么办,路由器设置网址打不开怎么办?
- POI对Word操作参考
- linux 将当前时间往后调整2分钟_linux调整系统时间 永久 z | 学步园
- 带疑问的歌词有哪些_带有(我)字的歌词有哪些
- 手机epub阅读软件
- python获取网页图片_python抓取网页中的图片示例
- 2013年全球最值得模仿的10个社交类网站应用
- docker上部署nginx容器80端口自动转443端口
- 遗传算法中常用的选择策略
- 五分之一金融机构将从2018年开始探索加密货币交易
- Mac 版 Chrome 删除自动填充条目 (搜索记录)
热门文章
- 配置GeeM2传奇登陆器详细图文教程
- python量化策略——多均值-趋势-股债轮动-策略
- K近邻算法python实现并显示决策边界
- 【数据结构课程设计】基于商和余数的快速排序
- 外包怎么了?请不要“妖魔化”它。
- 姜小白的Python日记Day7 文件的读写
- 以树莓派为控制中心的软硬件之开发之脑电波模块
- HTML+CSS模仿百度首页(gird+flex布局)
- android然后让list刷新到底部,Android笔记之:App列表之下拉刷新的使用
- Android自定义系列——10.PathMeasure