惊呆了,Servlet 3.0 的这个特性竟然99%的人都还不知道!
# 点击图片报名上海、南京源创会 #
目前tomcat8和java8基本上得道了普及,基于Servlet3.0(tomcat7就支持)来设计我们的java mvc框架显然会使我们的框架更加轻量!
今天我要说的是:ServletContainerInitializerServlet容器初始化器。
很多小伙伴对她并不陌生,例如Spring中的无web.xml配置也采用她来加载自定义WebApplicationInitializer。
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
// 省略部分代码和注释
}
然而好像大家都是在使用她查找自定义实现类,我脑洞大开可以使用她来查找注解类吗? 查看文档无果,没有说明是否支持注解!直接上代码测试吧~
实现类
package net.dreamlu.learn.core;
import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.HandlesTypes;
import net.dreamlu.learn.ioc.annotation.Component;
import net.dreamlu.learn.ioc.annotation.Service;
import net.dreamlu.learn.mvc.annotation.Controller;
/**
* 采用
*
* ServletContainerInitializer
*
* 实现我们的组件扫描
*
* @author L.cm
*/
@HandlesTypes({
Controller.class,
Service.class,
Component.class
})
public class ApplicationInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> classSet, ServletContext ctx) throws ServletException {
System.out.println("ServletContainerInitializer onStartup ~~~");
Application application = Application.me();
application.startup(classSet, ctx);
for (Class<?> clazz : classSet) {
System.out.println("onStartup: \t" + clazz.getName());
}
}
}
然后在META-INF/services/javax.servlet.ServletContainerInitializer文件中添加ServletContainerInitializer实现。
例如我们的是:net.dreamlu.learn.core.ApplicationInitializer
添加test类
@Controllerpublic class Test {}
启动我们的tomcat查看控制台输出:
ServletContainerInitializer onStartup ~~~
onStartup: net.dreamlu.learn.test.Test
总结
通过一个小例子我们发现HandlesTypes是支持注解的,光一个例子心里总是没底,下面我查找了tomcat和jboss中的具体实现的代码,有兴趣的朋友可以自己翻翻。
容器实现源码展示
tomcat源码:https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/startup/ContextConfig.java#L1660
jboss源码:
http://www.massapi.com/source/manual/jboss-6.0.0.Final-src/server/src/main/java/org/jboss/web/deployers/ServletContainerInitializerDeployer.java.html#190
参考
Servlet3.1规范(最终版)中文版:
http://jinnianshilongnian.iteye.com/blog/1912455
只要您于 5 月 12 日 24:00 前在“开源中国七大夏日必备编程神器,不容错过!”评论区留言,写下你用过最好的开源项目和项目地址,并说明为什么觉得最好,点赞数最多的前十名即可获得开源中国送出的编程神器一份哦!!!
这些开源软件养活了一票国产软件!