#概述

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的加载相关推荐

  1. java懒加载注解_在springboot中实现个别bean懒加载的操作

    懒加载---就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中. @Lazy 在需要懒加载的bean上加上@Lazy ...

  2. 【Web】解决简书图片不显示问题“系统维护中,图片暂时无法加载”

    个人博客: http://www.milovetingting.cn 简书不显示图片的解决方法 首次编辑于2019-6-6 最近几天在浏览简书上的文章时,发现图片显示不出来,提示"系统维护中 ...

  3. web.xml的contextConfigLocation作用及自动加载applicationContext.xml

    web.xml的contextConfigLocation作用及自动加载applicationContext.xml 转自:http://blog.csdn.net/sapphire_aling/ar ...

  4. 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3

    备注: 因为文章太长,所以将它分为三部分,本文是第三部分. 第一部分:深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1 第二部分:深入浅出经典面试题:从浏览器中输入URL ...

  5. 在 Swift 中使用闭包实现懒加载

    本文讲的是在 Swift 中使用闭包实现懒加载, 原文地址:Swift Lazy Initialization with Closures 原文作者:Bob Lee 译文出自:掘金翻译计划 译者:ls ...

  6. 如何在React Native中创建精美的动画加载器

    by Vikrant Negi 通过Vikrant Negi 如何在React Native中创建精美的动画加载器 (How to create a beautifully animated load ...

  7. fetchtype 动态控制_hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,使得Hi ...

  8. uboot加载linux内核加载那些内容,几个地址参数及uboot加载启动内核过程的理解

    关于uBoot和Linux内核中几个地址参数及uboot加载启动内核过程的理解 uboot一般使用mkimage工具先制作一个启动映象文件来引导识别内核的,uboot源代码的tools/目录下有mki ...

  9. Unity中使用代码将预制加载到场景

    Unity中使用代码将预制加载到场景 大家知道, 在日常修改预制的时候很方便, 我们将预制从资源文件夹往场景上"一拖", 然后就可以进行修改, 然后应用保存即可. 但是如果某些需求 ...

最新文章

  1. 【Appium】Appium+Python环境搭建
  2. 孩子听不进道理怎么办?
  3. 我的世界服务器如何修改加载规模,我的世界服务器预加载区域怎么调小
  4. DPDK源码编译(二十八)
  5. leetcode 24. Swap Nodes in Pairs | 24. 两两交换链表中的节点(Java)
  6. python列表的加法_Python列表加法理解
  7. jQuery中的日期时间控件
  8. win10系统cpu内核或逻辑核心缺少缺少,解决办法
  9. Reaction of travel book-ShanXi
  10. 计算机一级网址打不开怎么办,路由器设置网址打不开怎么办?
  11. POI对Word操作参考
  12. linux 将当前时间往后调整2分钟_linux调整系统时间 永久 z | 学步园
  13. 带疑问的歌词有哪些_带有(我)字的歌词有哪些
  14. 手机epub阅读软件
  15. python获取网页图片_python抓取网页中的图片示例
  16. 2013年全球最值得模仿的10个社交类网站应用
  17. docker上部署nginx容器80端口自动转443端口
  18. 遗传算法中常用的选择策略
  19. 五分之一金融机构将从2018年开始探索加密货币交易
  20. Mac 版 Chrome 删除自动填充条目 (搜索记录)

热门文章

  1. 配置GeeM2传奇登陆器详细图文教程
  2. python量化策略——多均值-趋势-股债轮动-策略
  3. K近邻算法python实现并显示决策边界
  4. 【数据结构课程设计】基于商和余数的快速排序
  5. 外包怎么了?请不要“妖魔化”它。
  6. 姜小白的Python日记Day7 文件的读写
  7. 以树莓派为控制中心的软硬件之开发之脑电波模块
  8. HTML+CSS模仿百度首页(gird+flex布局)
  9. android然后让list刷新到底部,Android笔记之:App列表之下拉刷新的使用
  10. Android自定义系列——10.PathMeasure