每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer...的文件,文件内容指定具体的ServletContainerInitializer实现类。...必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer 文件的内容就是ServletContainerInitializer...实现类的全类名; META-INF:tomcat默认就会去读取的 @HandlesTypes(value = MyHandlesType.class) public class MyServletContainerInitializer...SpringServletContainerInitializer的作用:加载一些第三方的依赖信息 @RestController public class IndexController {
webConfig这个方法的主要是解析web.xml,为servlet容器做准备,主要有以下步骤: **查找web.ml:**包含tomcat-web.xml, Tomcat/conf/web.xml..., 应用的web.xml,还有jar包里的web.xml **找到应用中所有的ServletContainerInitializer实现类:**将应用目录下META-INF/services/javax.servlet.ServletContainerInitializer...里 具体步骤: 加载META-INF/services/javax.servlet.ServletContainerInitializer下的文件类 遍历ServletContainerInitializer...`META-INF/services/javax.servlet.ServletContainerInitializer`下的文件类 detectedScis = loader.load...设置到entry里 // 要注意的是,这里判断null,是因为有可能在加载别的类的时候,加载过,这里的步骤属于懒加载
通用性更强 ServiceLoader它的使用方式可列为4个步骤: 创建一个接口文件 在resources资源目录下创建META-INF/services文件夹 在上面services文件夹中创建文件:...:META-INF/services/com.fsx.maintest.IService,然后在该文件里书写上实现类们,内容如下: ?...使用方式:每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer...文件的 META-INF/services/javax.servlet.ServletContainerInitializer 文件中进行注册 SCI(全称 ServletContainerInitializer...)则是根据约定的标准,扫描META-INF中包含注册信息的 class 并在启动阶段调用其onStartup 以Tomcat为例,源码解释原理 为了一探究竟,我下载了Tomcat9的源码并且编译运行
缘起 在前面几章的讲解中,我们知道,当我们执行以下代码时,springboot会启动一个内置的tomcat,并且加载对应的starter.那么如果我们不采用java -jar的方式启动springboot...关于SPI可以去了解我的另一篇文章 Java SPI 机制详解 SPI在springboot中的应用 我们看spring-web这个项目的spi文件javax.servlet.ServletContainerInitializer...也就是说,我们把 ServletContainerInitializer的实现类写在 META-INF / services / javax.servlet.ServletContainerInitializer...文件中,那么Tomcat等容器启动的时候就会去调用所有实现类的onStartup方法。...为了方便理解,我画了下图 [在这里插入图片描述]
如果应用程序是以 war 包的方式放入 Tomcat 的 webapps 文件夹下面,那么在 Tomcat 启动时会加载 war 包,生成对应的一个文件夹,Tomcat 则会去对 webapps 文件夹下面的每一个文件夹...(我们的应用程序)生成一个部署任务,去解析对应的 WEB-INF/web.xml 文件,将配置的 Servlet 加载到 Servlet 容器中。...│ │ └── services │ │ └── javax.servlet.ServletContainerInitializer │...ServletContainerInitializer 的实现类,Web 容器并不会识别它,需要借助 SPI 机制来指定该初始化类,通过在项目 ClassPath 路径下创建 META-INF/services...在 Spring 的 spring-web 子工程的 ClassPath 下面的有一个 META-INF/services/javax.servlet.ServletContainerInitializer
( javax.servlet.ServletContainerInitializer ),Tomcat提供了实现 Apache common-logging 中提供的日志接口,许多日志框架做了实现 稍微延伸一下...SPI HelloWorld 首先,了解下SPI机制的约定(约定优于配置理念): 在 META-INF/services/ 目录下创建一个以 接口全限定名 命名的文件,文件内容为 实现类的全限定名 使用...java.util.ServiceLoader 来动态加载 META-INF/services/ 下的实现类 实现类必须有一个无参构造器 假设森林动物园举行歌唱比赛,各参赛动物选手需高歌一曲。.../services目录,下面创建以接口全限定名org.utopiavip.spi.Animal命名的文件,内容为三位实现者: org.utopiavip.spi.Cat org.utopiavip.spi.Dog...ContextClassLoader 类加载规则中有这么一点:一个类中所关联的其他类都由当前类的加载器进行加载。
那时,还离不开 web.xml 的配置,在 xml 文件中编写繁琐的 servlet 和 filter 的配置。...│ └── services │ └── javax.servlet.ServletContainerInitializer └...机制来指定该初始化类,这一步骤是通过在项目路径下创建 META-INF/services/javax.servlet.ServletContainerInitializer 来做到的,它只包含一行内容...于是我猜想,内嵌 tomcat 的加载可能不依赖于 servlet3.0 规范和 SPI!它完全走了一套独立的逻辑。...前者就会导致容器搜索算法出现问题,因为这是 jar 包的运行策略,不会按照 servlet3.0 的策略去加载 ServletContainerInitializer!
javax.servlet.ServletContainerInitializer 文本文件中,该文件存在在独立JAR包中的 METE-INF/services 目录。...接口 的使用 ************** // 1、在jar包中创建META-INF/services/javax.servlet.ServletContainerInitializer文件 //...tomcat-websocket.jar // 解析类路径中"META-INF/services/javax.servlet.ServletContainerInitializer...tomcat-websocket.jar // 解析类路径中"META-INF/services/javax.servlet.ServletContainerInitializer...tomcat-websocket.jar // 解析类路径中"META-INF/services/javax.servlet.ServletContainerInitializer
旧版 配置嵌入式Servlet容器 SpringBoot默认使用Tomcat作为嵌入式Servlet容器 如何定制和修改Servlet容器相关配置 1.在配置文件中定制和修改Servlet容器有关的配置...更适合长连接的服务,但是长连接的服务Netty比Jetty更优秀 Undertow更适合于IO密集型服务器或者文件服务器,比Tomcat优秀 Jetty(长连接): ...的实现放在jar包的META-INF/services文件夹下,有一个javax.servlet.ServletContainerInitializer的文件,内容是ServletContainerInitializer...实现类的全类名 3.可以使用 @HandleTypes注解,在应用启动时加载需要的类 流程: 1.启动Tomcat 2. org\springframework\spring-web\5.1.9....RELEASE\spring-web-5.1.9.RELEASE.jar\META-INF\services\javax.servlet.ServletContainerInitializer Spring
我们配置DispatcherServlet最典型的是使用web.xml文件。...WebApplicationInitializer initializer : initializers) { initializer.onStartup(servletContext); } } } tomcat7...以后采用了servlet3标准,我们启动tomcat7(servlet3容器)时,容器通过JAR Services API 机制,探测到spring-web包下的一个文件META-INF/services.../javax.servlet.ServletContainerInitializer,文件内声明实现类,进而调用其onStartup方法,如果以后我们要自己实现ServletContainerInitializer...,也需要在相应jar包的 META-INF/services目录下放置这样一个以接口的全限定名命名的文件。
接口,接口只有一个onStartup方法,在支持Servlet3.0的Web应用服务器中,例如Tomcat7或更高版本,服务器会在启动的时候在类路径下查找javax.servlet.ServletContainerInitializer...ServletContainerInitializer接口的具体使用方法必须在代码的classpath下的META-INF/services/路径下定义一个名为javax.servlet.ServletContainerInitializer...Spring3.1中的SpringServletContainerInitializer实现了ServletContainerInitializer接口,同时在相应的jar包META-INF/services.../路径下定义了javax.servlet.ServletContainerInitializer文件,它的内容是org.springframework.web.SpringServletContainerInitializer...下面以代码运行在Tomcat7+的版本为例,当SpringBoot项目代码运行的时候,无论是内嵌Tomcat还是将代码打成war部署到外部Tomcat,代码都会运行到SpringApplication.run
spring与tomcat整合的整理的流程图如下: 流程图解析: 1.SPI机制:tomcat启动时会通过SPI的机制加载所有包下面的META-INF/services/javax.servlet.ServletContainerInitializer...此时tomcat就会实例化该全路径的类,然后调用onStartup()这就是spring和tomcat整合的入口,这种spi机制使用的非常广泛,比如springboot原理、数据库驱动等 2.onStartup...方法是读取类上的@HandlerTypes里面的接口的所有实现类,然后调用实现类的onStartup方法 3.创建父容器:创建父容器是在流程3中创建,此时仅仅是创建,并没有调用核心方法,调用核心方法的时机是后面触发监听器...,下面就不再继续跟了,感兴趣的可以继续了解。...本文是大概梳理了一下spring与tomcat结合的流程,希望对大家有帮助。
Java SPI SPI常用场景 数据库驱动加载 ?...MySQL Driver Servlet API中的javax.servlet.ServletContainerInitializer Dubbo中的类SPI机制,实现功能点的扩展(Dubbo可扩展机制实战.../services/com.tenmao.Scorer文件 com.tenmao.BarScorer 接口使用方 用户应用程序 public static void main(String[] args...score.score("1", "1"); System.out.println(scoreOne); } 注意事项 接口实现类必须包含无参构造函数(默认就有) 一般在XxxManager中不会注册实现类...参考 Java SPI思想梳理 Java SPI机制详解 Dubbo可扩展机制实战 我是SPI,我让框架更加优雅了!
你还要在你的配置上将这个接口添加进来,是不是感觉很违和,就像,我开发一个idea插件,我根据idea的规范做好了,发布了,我还用通知idea官方,让他们将我的插件开通下使用权限,是不是离谱了,没人理你。...Tomcat中,Tomcat初始化应用程序是通过META-INF/services/javax.servlet.ServletContainerInitializer读取到应用实现类,而spring也是一样的...,它是通过读取META-INFO/spring.factories这个文件来加载配置的。...之前有提到过,Tomcat加载应用的初始化程序,它是通过META-INF/services/javax.servlet.ServletContainerInitializer读取到应用实现类,而spring...也是一样的,它是通过读取META-INFO/spring.factories这个文件来加载配置的 然后我们在来看SpringBoot的自动配置,Spring是会引入下面的一个自动配置依赖,它里面有很多自动配置类
根据 Servlet 3.0 的新特性,web 容器启动的时候会扫描每个 jar 包下的 /META-INF/services/javax.servlet.ServletContainerInitializer...文件。...使用 Spring MVC 的 web 包,可以看到有这个文件: ?...) public class SpringServletContainerInitializer implements ServletContainerInitializer { Spring 的应用一启动就会加载感兴趣的...classes = {Controller.class}) }, useDefaultFilters = false) @EnableWebMvc public class ServletConfig { } 我的博客即将同步至腾讯云
SpringBoot 笔记 ( 十一 ):Servlet容器 SpringBoot默认使用Tomcat作为嵌入式的Servlet容器 1)、定制和修改Servlet容器的相关配置 1、修改配置文件中的和...Servlet容器来启动SpringBoot的web应用,没有web.xml文件。...jar包的META-INF/services文件夹下,有一个名为javax.servlet.ServletContainerInitializer的文件,内容就是ServletContainerInitializer...的实现类的全类名 3)、还可以使用 @HandlesTypes,在应用启动的时候加载我们感兴趣的类 2.启动流程: 1)、启动Tomcat 2)、SpringServletContainerInitializer...\META-INF\services\javax.servlet.ServletContainerInitializer:Spring的web模块里面有这个文件:org.springframework.web.SpringServletContainerInitializer
war包需要部署到web服务器中(Tomcat、Apache、IIS) 1.2 jar包 jar包是类的归档文件,主要用于存储Java类文件和相关资源文件。...1.3 主要区别: jar包主要用于存储Java类文件和相关资源文件,而war包主要用于存储Web应用程序相关的文件。 jar包可以被JVM直接加载和运行,而war包需要被Web服务器加载和运行。...框架必须在jar包的 META-INF/services 的文件夹中提供一个名为 javax.servlet.ServletContainerInitializer 的文件,文件内容要写明 ServletContainerInitializer...jar加入到classpath下,然后调用META-INF/MANIFEST.MF文件Start-Class属性完成应用程序的启动。....class 文件和静态资源文件、配置文件等 META-INF:有一个 MANIFEST.MF 的文件 org:spring-boot-loader 的一些 .class 文件 META-INF 下面的
spi 机制是这样的:读取 META-INF/services/ 目录下的元信息,然后 ServiceLoader 根据信息加载对应的类,你可以在自己的代码中使用这个被加载的类。...要使用 Java SPI,需要遵循如下约定: 当服务提供者提供了接口的一种具体实现后,在 jar 包的 META-INF/services 目录下创建一个以 “接口全限定名” 命名的文件,内容为实现类的全限定名...; 接口实现类所在的 jar 包放在主程序的 classpath 中; 主程序通过 java.util.ServiceLoder 动态装载实现模块,它通过扫描 META-INF/services 目录下的配置文件找到实现类的全限定名...当我们执行 java -jar 的时候 jar 文件以二进制流的形式被读取到内存,但不会加载到 jvm 中,类会在一个合适的时机加载到虚拟机中。...jar 中其他的文件包括 jar 包被当做了资源文件,而不会去读取里面的 .class 文件。
前言:刚毕业我就接触到了SpringBoot,当初感觉必成大器,第一印象就是内置了所有环境,打完包丢哪里都能跑起来,简化了tomcat Xml配置的一系列部署操作 1.SpringMvc XML配置 说到配置...1.1 配置web.xml web.xml是servlet容器的配置文件,当启动一个WEB项目时,servlet容器首先会读取项目中的webapp/WEB-INFO文件夹的web.xml配置文件里的配置...传统配置的web.xml 是在servlet容器启动的时候加载的,那实现webApplicationInitializer的自定义的类应该也要在servlet容器启动的时候被加载到 是不是tomcat也学...但是他们工程师绝对不会这么干,因为WebApplicationInitializer是Spring提供的,一个实现Servlet规范的容器不可能依赖Spring的jar包。...前提是必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer
,提供了运行时的可插拔的插件能力; 说明:Servlet3.0及以上的标准是需要Tomcat7及以上的支持; 如果使用全注解开发,那么就可以去掉web.xml配置文件了,转用编码方式进行替代 ----...的实现 2、提供ServletContainerInitializer的实现类; 必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer...文件的内容就是ServletContainerInitializer实现类的全类名; 总结:容器在启动应用的时候,会扫描当前应用每一个jar包里面 META-INF/services/javax.servlet.ServletContainerInitializer...,会扫描每个jar包下的META-INF/services/javax.servlet.ServletContainerInitializer 2、加载这个文件指定的类SpringServletContainerInitializer...3、spring的应用一启动会加载感兴趣的WebApplicationInitializer接口的下的所有组件; 4、并且为WebApplicationInitializer组件创建对象(组件不是接口