Spring WebApplicationinitializer位于 Sring web下的 package org.springframework.web;
容器启动之后会调用该接口的on startup方法;代码如下
为什么容器启动之后会调用该接口的on startup 方法,主要是由于位于它同包下的另一个类 SpringServletContainerInitializer
可以看到SpringServletContainerInitializer 主要是继承了ServletContainerInitializer 会在容器启动之后调用onStrartUp方法,该方法有两个参数,一个是Set<Class>,一个是容器上下文ServletContext。Set<Class>的值由类头部的注解 @HandlesTypes(WebApplicationInitializer.class)控制,会传入所有继承了注解的类的class,将set<class>和ServletContext传入该方法后,会通过放射的方式创建每一个类的实例保存到list中,并调用每一个类的onStartUp方法,执行初始化操作。
ServletContainerInitializer 是位于javax.servlet包下的类,容器启动之后会调用该类的onStartup方法。
可以看到类上的注释,大致意思为:继承这个接口必须在jar文件的 META-INF/services目录下声明一个文件,文件的名字是这个接口的完全限定类名称,并将被运行时的服务提供者查找机制或者被容器中特定的类似机制发现。在任一情况下,来自web服务器的jar排除的独立命令必须被忽略,发现这些服务的顺序必须遵循应用程序的加载委托模式。
去Spring的源码去找,就会发现接口声明的文件
网友评论