{ //省略其余代码 } 可以看到这个类继承了一个叫ServletContainerInitializer的接口 public interface ServletContainerInitializer...ServletContainerInitializer 是 Servlet 3.0 新增的一个接口,主要用于在容器启动阶段通过编程风格注册Filter, Servlet以及Listener,以取代通过web.xml...容器启动阶段依据java spi获取到所有ServletContainerInitializer的实现类,然后执行其onStartup方法....也就是说,我们把 ServletContainerInitializer的实现类写在 META-INF / services / javax.servlet.ServletContainerInitializer...SpringServletContainerInitializer就是ServletContainerInitializer的实现类,可以看到SpringServletContainerInitializer
实现类:**将应用目录下META-INF/services/javax.servlet.ServletContainerInitializer加载,并将加载的实现类作为key放入initializerClassMap...>,再遍历Set,与initializerClassMap的key匹配,匹配上就把当前class(也就是HandlesTypes.value的实现类...实现类,可以直接通过key(class)取到需要传入该class的ServletContainerInitializer实现类,然后和initializerClassMap匹配, 将匹配上的class添加到...ServletContainerInitializer实现类,实现类作为key put到initializerClassMap, 待后面步骤使用 判断是否有HandlesTypes注解,没有注解直接过,...void processServletContainerInitializers() { List detectedScis
规范中通过ServletContainerInitializer实现此功能。...每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer...的文件,文件内容指定具体的ServletContainerInitializer实现类。...1、Servlet容器启动会扫描,当前应用里面每一个jar包的 ServletContainerInitializer的实现 2、提供ServletContainerInitializer的实现类;...必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer 文件的内容就是ServletContainerInitializer
SpringMVC运作的信息在以前,我们会在web.xml中配置SpringMVC,然后SpringMVC会根据web.xml中的配置初始化DisptacherServlet在servlet3.0之后,出现了ServletContainerInitializer...,可以在项目启动最开始时,会自动扫描实现了ServletContainerInitializer接口的类,对Servlet、Listener、Filter进行动态注册,利用此技术,可以通过实现ServletContainerInitializer...来配置DisptacherServlet(注册controller,ViewResolve),达到SpringMVC零配置的效果 关于ServletContainerInitializer (可以先跳过这部分...,往后面看)ServletContainerInitializer的作用和web.xml差不多,都是部署servlet,listener,filter,只是一个是用java代码配置,一个用xml配置在实现了...ServletContainerInitializer接口的类上要注解上@HandlesTypes(//要动态注册的class,一定要是Servlet或者Listener或者Filter)ServletContainerInitializer
ServletException; } 同时可以利用@HandlesTypes注解,把要加载到onStartup方法中的类字节码传入进来,@HandlesTypes源码如下: /** * 用于指定要加载到ServletContainerInitializer...接口实现了中的字节码 * @see javax.servlet.ServletContainerInitializer * @since Servlet 3.0 */ @Target({ElementType.TYPE...}) @Retention(RetentionPolicy.RUNTIME) public @interface HandlesTypes { /** * 指定要加载到ServletContainerInitializer...Annotation manual"); } } 第三步:创建初始化容器的类,并按照要求配置 public class MyServletContainerInitializer implements ServletContainerInitializer...在目录中创建一个名称为javax.servlet.ServletContainerInitializer的文件,里面写实现了ServletContainerInitializer接口的全限定类名。
ServletContainerInitializer 也是 Servlet 3.0 新增的一个接口,容器在启动时使用 JAR 服务 API(JAR Service API) 来发现 ServletContainerInitializer...而方法入参中 Set<class<class</class</class 这么声明一个 ServletContainerInitializer 的实现类,web 容器并不会识别它,所以,需要借助 SPI...寻找 spring 中 ServletContainerInitializer 的实现类并不困难,可以迅速定位到 SpringServletContainerInitializer 该实现类。...前者就会导致容器搜索算法出现问题,因为这是 jar 包的运行策略,不会按照 servlet3.0 的策略去加载 ServletContainerInitializer!...,后者 ServletContainerInitializer 是 javax.servlet.ServletContainerInitializer,前文还提到 RegistrationBean 实现了
使用方式:每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer...ServletContainerInitializer { ... } ServletContainerInitializer 是 Servlet 3.0 新增的一个接口,主要用于在容器启动阶段通过编程风格注册...原理 ServletContainerInitializer接口的实现类通过java SPI声明自己是ServletContainerInitializer 的provider 容器启动阶段依据java...(继承或者实现)的类放在ServletContainerInitializer接口的集合参数c中传递进来。...文件的 META-INF/services/javax.servlet.ServletContainerInitializer 文件中进行注册 SCI(全称 ServletContainerInitializer
ServletException; } 同时可以利用@HandlesTypes注解,把要加载到onStartup方法中的类字节码传入进来,@HandlesTypes源码如下: /** * 用于指定要加载到ServletContainerInitializer...接口实现了中的字节码 * @see javax.servlet.ServletContainerInitializer * @since Servlet 3.0 */ @Target({ElementType.TYPE...}) @Retention(RetentionPolicy.RUNTIME) public @interface HandlesTypes { /** * 指定要加载到ServletContainerInitializer...初始化容器操作 * @Company http://www.itheima.com */ public class MyServletContainerInitializer implements ServletContainerInitializer...在目录中创建一个名称为javax.servlet.ServletContainerInitializer的文件,里面写实现了ServletContainerInitializer接口的全限定类名。
Spring mvc是跟着更底层的接口标准servlet走的,servlet3+以后引入ServletContainerInitializer接口,这为去web.xml,基于代码配置提供了一种途径: public...interface ServletContainerInitializer { public void onStartup(Set<Class<?...HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInitializer implements ServletContainerInitializer...我们启动tomcat7(servlet3容器)时,容器通过JAR Services API 机制,探测到spring-web包下的一个文件META-INF/services/javax.servlet.ServletContainerInitializer...,文件内声明实现类,进而调用其onStartup方法,如果以后我们要自己实现ServletContainerInitializer ,也需要在相应jar包的 META-INF/services目录下放置这样一个以接口的全限定名命名的文件
关于第二点,也许大家觉得直接通过ServletContext对象调用addServlet()等方法就可以了,没必要再引入一个ServletContainerInitializer接口;非也非也!...一个ServletContext对象往往对应着一个Java Web应用,它是由Servlet容器创建的,开发者要想获取这个全局对象并不是很方便,于是才有ServletContainerInitializer...接口一说,它的内容如下: package javax.servlet; public interface ServletContainerInitializer { void onStartup...从官方文档的描述看,基于Spring Boot的Java Web应用会内嵌Servlet容器,如果沿用外置容器(Servlet容器 ==> ServletContainerInitializer ==>...Spring Boot所内嵌的Servlet容器并不会以SPI这种方式去加载ServletContainerInitializer,而是间接通过TomcatStarter触发,具体如下: package
public interface ServletContainerInitializer { void onStartup(Set<Class<?...ServletContainerInitializer接口的具体使用方法必须在代码的classpath下的META-INF/services/路径下定义一个名为javax.servlet.ServletContainerInitializer...Spring3.1中的SpringServletContainerInitializer实现了ServletContainerInitializer接口,同时在相应的jar包META-INF/services...根据上面对javax.servlet.ServletContainerInitializer接口分析可知,SpringServletContainerInitializer的onStartup方法会在web...通过源码发现TomcatStarter也实现了ServletContainerInitializer接口,不过它没有使用和SpringServletContainerInitializer一样的实现机制
第一步:我们写一个MyServletContainerInitializer 类实现ServletContainerInitializer 接口 第二步:在这个路径下新建一个文件 注意:从运行结果可以分析出...的实现 2、提供ServletContainerInitializer的实现类; 必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer...文件的内容就是ServletContainerInitializer实现类的全类名; 总结:容器在启动应用的时候,会扫描当前应用每一个jar包里面 META-INF/services/javax.servlet.ServletContainerInitializer...类实现ServletContainerInitializer 接口 //容器启动的时候会将@HandlesTypes指定的这个类型下面的子类(实现类或者子接口等)传递过来 //传入感兴趣的类型 @HandlesTypes...(value = {HelloService.class}) public class MyServletContainerInitializer implements ServletContainerInitializer
javax.servlet.ServletContainerInitializer 文本文件中,该文件存在在独立JAR包中的 METE-INF/services 目录。...使用了Servlet3.0+ ,具体可以看上面 :Spring web 自动装配 Tomcat 加载 ServletContainerInitializer 文件。...import java.util.Set; import javax.servlet.ServletContainerInitializer; // ************** ServletContainerInitializer...接口 的使用 ************** // 1、在jar包中创建META-INF/services/javax.servlet.ServletContainerInitializer文件 //...loader.load(ServletContainerInitializer.class); // 检测到的 ServletContainerInitializer for
ServletContainerInitializer 也是 Servlet 3.0 新增的一个接口,容器在启动时使用 JAR 服务 API(JAR Service API) 来发现 ServletContainerInitializer...文件来做到的,内容如下: cn.edu.shopping.CustomServletContainerInitializer 这样一来,使用 ServletContainerInitializer 和...前者就会导致容器搜索算法出现问题,因为这是 jar 包的运行策略,不会按照 Servlet 3.0 的策略去加载 ServletContainerInitializer!...最后作者还提供了一个替代选项:ServletContextInitializer,它和 ServletContainerInitializer 长得特别像,别搞混淆了!...是 javax.servlet.ServletContainerInitializer,前文提到的 RegistrationBean 就实现了 ServletContextInitializer 接口
2.1 Servlet3.0规范中引导应用启动的说明 在Servlet容器(Tomcat、Jetty等)启动应用时,会扫描应用jar包中 ServletContainerInitializer 的实现类...框架必须在jar包的 META-INF/services 的文件夹中提供一个名为 javax.servlet.ServletContainerInitializer 的文件,文件内容要写明 ServletContainerInitializer...这个 ServletContainerInitializer 是一个接口,实现它的类必须实现一个方法:onStartUp 可以在这个 ServletContainerInitializer 的实现类上标注...public interface ServletContainerInitializer { void onStartup(Set<Class<?...HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInitializer implements ServletContainerInitializer
ServletContainerInitializer 之前web容器要整合其余模块,都是通过web.xml来的。那么现在注解驱动的话,怎么做呢?...这就是Servlet3.0给我们提供的特别特别重要的一个类ServletContainerInitializer来整个其它模块组件。通过读Servlet3.0的官方文档如下: ?...的实现 coder可以自己提供ServletContainerInitializer的实现类;然后自己书写逻辑。...但是,但是,但是要记住,一定要必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer这个文件里,文件内容为就是ServletContainerInitializer...前面已经说过ServletContainerInitializer了,相信大家能够想到Spring是怎么做的了吧?直接参照Spring官方文档先看看: ?
那接下来我们来看看SpringMvc的启动核心科技 首先tomcat是一个Servlet容器,遵循并实现了Servlet的规范,tomcat7之后是3.0的,在3.0的有个新的特性 就是它 :ServletContainerInitializer...前提是必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer...实现类 一般伴随着ServletContainerInitializer一起使用的还有@HandlesTypes注解,他会在调用onStartup方法的时候会把所有实现的类集合传给你。...} //准备上下文,主要会提前放入他自己的ServletContextInitializer(Servlet上下文是初始化器) //实现类,供SpringBoot在ServletContainerInitializer...server to trigger initialization listeners this.tomcat.start(); } 在这时候按照servlet3.0的标准,Tomcat启动的时候会调用ServletContainerInitializer
servlet3.0的8.2.4 Shared libraries / runtimes pluggability中的规则: 1.服务器启动(web应用启动)会创建当前web应用里面每一个jar包里面ServletContainerInitializer...实例 2.ServletContainerInitializer的实现放在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
根据 Servlet 3.0 的新特性,web 容器启动的时候会扫描每个 jar 包下的 /META-INF/services/javax.servlet.ServletContainerInitializer...HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInitializer implements ServletContainerInitializer
(主要介绍ServletContainerInitializer,关于filter只是拓展阅读) servlet和filter的区别 Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理...javax.servlet.ServletContextListener#contextInitialized(ServletContextEvent sce)回调函数中调用 在javax.servlet.ServletContainerInitializer...至此,DispatcherServlet已完成注入 总结 spring利用Tomcat的Servlet中,ServletContainerInitializer会被回调的机制,实现了TomcatStarter
领取专属 10元无门槛券
手把手带您无忧上云