博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot--嵌入式Servlet容器自动配置原理
阅读量:2442 次
发布时间:2019-05-10

本文共 4902 字,大约阅读时间需要 16 分钟。

嵌入式Servlet容器自动配置原理

EmbeddedServletContainerAutoConfiguration:嵌入式的Servlet容器自动配置?

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)@Configuration@ConditionalOnWebApplication@Import(BeanPostProcessorsRegistrar.class)//导入BeanPostProcessorsRegistrar:Spring注解版;给容器中导入一些组件//导入了EmbeddedServletContainerCustomizerBeanPostProcessor://后置处理器:bean初始化前后(创建完对象,还没赋值赋值)执行初始化工作public class EmbeddedServletContainerAutoConfiguration {
@Configuration @ConditionalOnClass({
Servlet.class, Tomcat.class })//判断当前是否引入了Tomcat依赖; @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)//判断当前容器没有用户自己定义EmbeddedServletContainerFactory:嵌入式的Servlet容器工厂;作用:创建嵌入式的Servlet容器 public static class EmbeddedTomcat {
@Bean public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory(); } } /** * Nested configuration if Jetty is being used. */ @Configuration @ConditionalOnClass({
Servlet.class, Server.class, Loader.class, WebAppContext.class }) @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT) public static class EmbeddedJetty {
@Bean public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
return new JettyEmbeddedServletContainerFactory(); } } /** * Nested configuration if Undertow is being used. */ @Configuration @ConditionalOnClass({
Servlet.class, Undertow.class, SslClientAuthMode.class }) @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT) public static class EmbeddedUndertow {
@Bean public UndertowEmbeddedServletContainerFactory undertowEmbeddedServletContainerFactory() {
return new UndertowEmbeddedServletContainerFactory(); } }

1)、EmbeddedServletContainerFactory(嵌入式Servlet容器工厂)

public interface EmbeddedServletContainerFactory {
//获取嵌入式的Servlet容器 EmbeddedServletContainer getEmbeddedServletContainer( ServletContextInitializer... initializers);}

在这里插入图片描述

2)、EmbeddedServletContainer:(嵌入式的Servlet容器)

在这里插入图片描述

3)、以TomcatEmbeddedServletContainerFactory为例

@Overridepublic EmbeddedServletContainer getEmbeddedServletContainer(      ServletContextInitializer... initializers) {
//创建一个Tomcat Tomcat tomcat = new Tomcat(); //配置Tomcat的基本环节 File baseDir = (this.baseDirectory != null ? this.baseDirectory : createTempDir("tomcat")); tomcat.setBaseDir(baseDir.getAbsolutePath()); Connector connector = new Connector(this.protocol); tomcat.getService().addConnector(connector); customizeConnector(connector); tomcat.setConnector(connector); tomcat.getHost().setAutoDeploy(false); configureEngine(tomcat.getEngine()); for (Connector additionalConnector : this.additionalTomcatConnectors) {
tomcat.getService().addConnector(additionalConnector); } prepareContext(tomcat.getHost(), initializers); //将配置好的Tomcat传入进去,返回一个EmbeddedServletContainer;并且启动Tomcat服务器 return getTomcatEmbeddedServletContainer(tomcat);}

4)、我们对嵌入式容器的配置修改是怎么生效?

ServerProperties、EmbeddedServletContainerCustomizer

EmbeddedServletContainerCustomizer:定制器帮我们修改了Servlet容器的配置?

怎么修改的原理?

5)、容器中导入了EmbeddedServletContainerCustomizerBeanPostProcessor

//初始化之前@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName)      throws BeansException {
//如果当前初始化的是一个ConfigurableEmbeddedServletContainer类型的组件 if (bean instanceof ConfigurableEmbeddedServletContainer) {
// postProcessBeforeInitialization((ConfigurableEmbeddedServletContainer) bean); } return bean;}private void postProcessBeforeInitialization( ConfigurableEmbeddedServletContainer bean) {
//获取所有的定制器,调用每一个定制器的customize方法来给Servlet容器进行属性赋值; for (EmbeddedServletContainerCustomizer customizer : getCustomizers()) {
customizer.customize(bean); }}private Collection
getCustomizers() {
if (this.customizers == null) {
// Look up does not include the parent context this.customizers = new ArrayList
( this.beanFactory //从容器中获取所有这葛类型的组件:EmbeddedServletContainerCustomizer //定制Servlet容器,给容器中可以添加一个EmbeddedServletContainerCustomizer类型的组件 .getBeansOfType(EmbeddedServletContainerCustomizer.class, false, false) .values()); Collections.sort(this.customizers, AnnotationAwareOrderComparator.INSTANCE); this.customizers = Collections.unmodifiableList(this.customizers); } return this.customizers;}ServerProperties也是定制器

步骤:

1)、SpringBoot根据导入的依赖情况,给容器中添加相应的EmbeddedServletContainerFactory【TomcatEmbeddedServletContainerFactory】

2)、容器中某个组件要创建对象就会惊动后置处理器;EmbeddedServletContainerCustomizerBeanPostProcessor;

只要是嵌入式的Servlet容器工厂,后置处理器就工作;

3)、后置处理器,从容器中获取所有的EmbeddedServletContainerCustomizer,调用定制器的定制方法

转载地址:http://hwpqb.baihongyu.com/

你可能感兴趣的文章
chromebook刷机_关闭盖子时如何保持Chromebook开机
查看>>
如何在iPhone或iPad上隐藏您的应用程序文件夹名称
查看>>
谷歌书签删除重复_如何删除Google表格中的重复项
查看>>
autohotkey_如何编写一个AutoHotkey脚本
查看>>
如何在Ubuntu上安装KVM和创建虚拟机
查看>>
科尔颂 弗拉基米尔_每日新闻综述:科尔希望您的亚马逊回归
查看>>
outlook使用技巧_微软新Outlook.com的6个技巧和窍门
查看>>
我们尝试了Microsoft的Mac浏览器的New Edge,您也可以
查看>>
如何在Windows 7任务栏上提供更多空间
查看>>
什么是“系统空闲进程”,为什么使用那么多的CPU?
查看>>
我的Internet路由器可能会磨损吗?
查看>>
不是bios引导是什么意思_引导后我的BIOS会做什么?
查看>>
edge chromium_微软的Chromium-Powered Edge具有深色模式,这是启用它的方法
查看>>
op 圣诞节活动_您所说的话:您的怪异圣诞节清单上有什么
查看>>
如何在Windows 8“开始”屏幕上禁用动画
查看>>
如何禁用或重新分配Windows密钥?
查看>>
你说了什么:如何找到新书
查看>>
如何将联系人转移到新的Android手机
查看>>
ipad和iphone适配_如何在iPhone和iPad上调节音乐均衡器
查看>>
USB 4将以更少的钱带来Thunderbolt的速度
查看>>