servletcontainerinitializer 是servlet3.0以上版本才有的;
可以用来插拔式注册组件:
原理:
Tomcat容器的ServletContainerInitializer机制的实现,主要交由Context容器和ContextConfig监听器共同实现,ContextConfig监听器负责在容器启动时读取每个web应用的WEB-INF/lib目录下包含的jar包的META-INF/services/javax.servlet.ServletContainerInitializer(依赖的jar包),以及web根目录下的META-INF/services/javax.servlet.ServletContainerInitializer(自己项目的),通过反射完成这些ServletContainerInitializer的实例化,然后再设置到Context容器中,最后Context容器启动时就会分别调用每个ServletContainerInitializer的onStartup方法;
demo:
1,自己项目的话开发中位置不变.且名字不能改.如下红框:
然后该文件里的值为.实现ServletContainerInitializer的类的全路径
本例值为:
com.chi.MyservletContainerInitilizer
该类中的结构如下
@HandlesTypes({MyWebApplicationInit.class})
public class MyservletContainerInitilizer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
System.out.println("xixixixiii");
}
}
实现类有个onstartup()方法;tomcath会调用该方法.其中set的值为@HandlesTypes({MyWebApplicationInit.class})这个注解里我们自己定义的class类型,这个class类型必须是接口,这样在方法中通过set就可以获取对应的类型对象来完成一定的功能,看业务需求;另一个参数值为servletcontext.可以用它的api注册自定义的filter.listener,servlet等;这样启动Tomcat时就会初始化这些组件;完成注册