嵌入式 Servlet 容器自动配置原理|学习笔记

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 快速学习嵌入式 Servlet 容器自动配置原理

开发者学堂课程【SpringBoot快速掌握 - 核心技术嵌入式 Servlet 容器自动配置原理】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/612/detail/9261


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

基本内容

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

步骤

 

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

嵌入式 Servlet 容器自动配置原理=嵌入式 Servlet 容器是怎样配置上去是怎样工作的

参照springBoot里面的自动配置包-web 块-观察名字嵌入式 Servlet 容器自动配置-接下来观察 直接“1.范例这个类

1.范例嵌入式Servlet容器自动配置):

@AutoConfigureorder (Ordered . HIGHEST PRECEDENCE)

@Configuration

@Conditional0nWebApplication

@Import(BeanPostProcessorsRegistrar.class)

public class EmbeddedServletContainerAutoConfiguration {

//在web应用下EmbeddedServletContainerAutoConfiguration自动配置才生效

//导入BeanPostProcessorsRegistar叫做后置处理器的配置器

在spring注解版里有详细的介绍。

作用给容器中导入一些组件

//导入了EmbeddedServletContainerAutoConfiguration叫做后置处理器

//后置处理器的作用bean初始化前后创建完对象还没有进行属性赋值开始执行初始化工作

@Configuration

@Conditional0nClass({ Servlet. class, Tomcat.class })

//它的作用是判断当前是否引入了Tomcat依赖; @ConditionalonMissingBean(value=EmbeddedServletCcontainerFactory.class, search =SearchStrategy.CURRENT)

//判断当前容器中没有用户自己定义的

EmbeddedServletContainerFactory

嵌入式的Servlet容器工厂;作用:创建嵌入式的Servlet容器

public static class EmbeddedTomcat {

@Bean

publicTomcatEmbeddedServletContainerFactory  tomcatEmbeddedServletContainerFactory()

{

return new TomcatEmbeddedServletContainerFactory();

}

}

/**

* Nested configuration if Undertow is being used.

*/

@Configuration

@Conditional0nClass({Servlet.class,Undertow.class,SslClientAuthMode.class})

@ConditionalOnMissingBean(value=EmbeddedServletContainerFactory.class.search.SearchStrategy CURRENT )

public static class EmbeddedUndertow {

@Bean

publicUndertowEmbeddedServletContainerFactoryundertowEmbeddedServletContainerFactory() {

return new UndertowEmbeddedServletContainerFactory();

}

}

l 1)EmbeddedServletCcontainerFactory(嵌入式Servlet容器工厂)

这个工厂定义了一个方法方法如下:

public interface EmbeddedServletContainerFactory {

//唯一的一个方法:获取嵌入式的Servlet容器

EmbeddedServletContainerget EmbeddedServletContainer (ServletContextInitializer... initializers);

}

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

2.自动配置原理

l 如果是Servlet tomcat 一类相当于导了tomcat 一类,就创建一个tomcat Servlet的嵌入式工

l 如果是导了 jetty 一类,像 Servlet 一类都是 jetty 包下,如果导入了 jetty 一类,就帮放一个 jetty 的工

l 如果是导入了 Undertow就帮放一个 Undertow 的嵌入式 Servlet 容器工厂

l 这里有一个判断,正好这个判断就形成了之前要切换容器的时候,现在只需要把tomcat 依赖移除,导入 jetty,那相当于 Jetty 这段配置就生效,导入 Undertow那么 Undertow 这个配置生效;

 以上这三段程序来配置各种嵌入式的容器工厂。

3.以 TomcatEmbeddedServletContaierFactory为例

@override Public 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.对嵌入式容器的配置的修改怎么生效

修改时有两种方式

l 一种是改配置文件里面和Servlet有关的属性,它是和Servletproperties绑定的

l 第二种是自主放一个嵌入式容器的定制器EmbeddedServletContainerCustomizer

第一种ServerProperties

第二种EmbeddedServletContainerCustomizer

 

5. EmbeddedServletContainerCustomizer :

定制器帮我们修改了Servlet容器的配置?  修改的原理是什么?

在容器中导入EmbeddedServletContainerCustomizerBeanPostProcessor

//这段代码就是在初始化之前对对象进行创建还没有赋值

@Override

public Object postProgessBeforeInitialization(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 cusfomizer: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,AnnotationAware0rderComparator.INSTANCE)this.customizers.Collections.unmodifiableList(this.customizers);

}

return this. customizers ;

}

6.ServerProperties也是定制器

 

二、步骤

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

EmbeddedServletContainerFactory

比如TomcatEmbeddedServletContainerFactory

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

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

3、后置处理器,从容器中获取所有的EmbeddedServletContainer

Customizer ,调用定制器的定制方法

三个步骤完成之后定制器便会启动

相关文章
|
22天前
|
运维 持续交付 虚拟化
深入解析Docker容器化技术的核心原理
深入解析Docker容器化技术的核心原理
45 1
|
2月前
|
存储 监控 Shell
docker的底层原理二:容器运行时环境
本文深入探讨了Docker容器运行时环境的关键技术,包括命名空间、控制组、联合文件系统、容器运行时以及分离的进程树,这些技术共同确保了容器的隔离性、资源控制和可移植性。
45 5
|
3月前
|
Kubernetes Linux 虚拟化
一文详解容器技术简介和基本原理
本文全面阐述了容器技术的发展历程、关键技术、架构和当前的行业生态,特别是容器技术在云环境中的应用和演进。
|
4月前
|
XML Java 数据格式
Spring5入门到实战------2、IOC容器底层原理
这篇文章深入探讨了Spring5框架中的IOC容器,包括IOC的概念、底层原理、以及BeanFactory接口和ApplicationContext接口的介绍。文章通过图解和实例代码,解释了IOC如何通过工厂模式和反射机制实现对象的创建和管理,以及如何降低代码耦合度,提高开发效率。
Spring5入门到实战------2、IOC容器底层原理
|
4月前
|
容器
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Group Box的使用及说明
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Group Box的使用及说明
309 3
|
4月前
|
容器
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Tab Widget的使用及说明
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Tab Widget的使用及说明
181 2
|
4月前
|
消息中间件 Kubernetes 数据库
在k8S中,初始化容器(init container)概念原理是什么?
在k8S中,初始化容器(init container)概念原理是什么?
|
5月前
|
存储 安全 算法
(九)深入并发编程之并发容器:阻塞队列、写时复制容器、锁分段容器原理详谈
相信大家在学习JavaSE时都曾接触过容器这一内容,一般Java中的容器可分为四类:Map、List、Queue以及Set容器,而在使用过程中,对于ArrayList、HashMap等这类容器都是经常使用的,但问题在于这些容器在并发环境下都会存在线程安全问题。
|
3天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
119 77
|
11天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序