您的位置:首页 > 其它

惊呆了,Servlet3.0的这个特性竟然99%的人都还不知道!

2017-05-08 21:07 375 查看
目前tomcat8和java8基本上得道了普及,基于Servlet3.0(tomcat7就支持)来设计我们的java mvc框架显然会使我们的框架更加轻量!

今天我要说的是:
ServletContainerInitializer
Servlet容器初始化器。

很多小伙伴对她并不陌生,例如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类

@Controller
public 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: