文档章节

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

如梦技术
 如梦技术
发布于 2017/05/08 21:07
字数 422
阅读 6051
收藏 131

目前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类

@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

© 著作权归作者所有

如梦技术

如梦技术

粉丝 363
博文 52
码字总数 25132
作品 6
朝阳
后端工程师
私信 提问
加载中

评论(30)

泥人张
泥人张
mark
wangbo888
wangbo888
明天来osc震惊部报道
墨子Zhai
墨子Zhai

引用来自“罗格林”的评论

@HandleTypes需要传入具体的注解类型,如果这样写MVC框架,岂不是每加一个新注解,还要在这个地方修改一把?如果三方插件需要加注解,那框架核心还得跟着升级?

引用来自“如梦技术”的评论

如果容器底层把组合注解实现了那就厉害了,不过倒是可以直接用CDI!
如果容器底层把组合注解实现了... ? 那不是正是java EE 7吗。
哎码
哎码

引用来自“罗格林”的评论

@HandleTypes需要传入具体的注解类型,如果这样写MVC框架,岂不是每加一个新注解,还要在这个地方修改一把?如果三方插件需要加注解,那框架核心还得跟着升级?
单就这个问题而言,可以在注解上继续加注解来解决,比如spring boot的@SpringBootApplication这样,也可以同名包覆盖的形式重写注解类。
BUT~~~都是蛋疼得方法,估计没人会这么弄😂
f
freezingsky
标题党了
墨子Zhai
墨子Zhai
不奇怪,用spring开发的人,基本可以无视java EE规范。
spring 始终和java EE是竞争与合作的关系。竞争大于合作的。spring 5.0说不定会完全背离java EE。

尽管spring 4.x 并不比java ee 7好!
yuri-li
yuri-li
写的啥呀
izee
izee

引用来自“xshrim”的评论

JAVA就喜欢臭长臭长的一大串
我觉得比PHP好多了
dfghyn
dfghyn

引用来自“YanbinQ”的评论

冲这个标题我就不愿读,宁愿google一下 servlet 3 新特性
+1
dfghyn
dfghyn
就是为了吐槽这个标题进来的。作为一个技术社区,用这种标题党风格的语法好么?小编根据哪些统计数据证明99%的程序员都不知道??????
自由职业者感言:没有乐趣,能走多远?

我做网站没有十年的话,也至少有五年了。什么web语言都懂一些,都做过一些,但是说到头来,都不精,只会做些皮毛,给外行搭个样子。但是我喜欢做网站,喜欢这种东西,喜欢这种沟通的方式,做...

2010/08/31
0
0
Cortana 和 Siri “和平共处”了

今天体验了Mac上最好用的虚拟机Parallels Desktop 当看到上面的画面的时候我惊呆了!!! Cortana 和 Siri 竟然“和平共处” 了,问了度娘才知道是 PD13的新功能: 与上一代产品相比,PD13 ...

dubox
2017/10/30
9
0
Servlet3.0新特性剖析

Servlet3.0规范的新特性主要是为了3个目的: 1.简化开发 2.便于布署 3.支持Web2.0原则 为了简化开发流程,Servlet3.0引入了注解(annotation),这使得web布署描述符web.xml不在是必须的选择...

长平狐
2012/09/03
226
0
Servlet3.0异步的实现需要http1.1的支持?

今天我在学习servlet3.0的新特性:servlet3.0对异步的支持。 网上有人说,servlet3.0对异步的支持需要http1.1。 现在我把servelt3.0对异步支持的原理也理解的差不多了,并且查阅了http1.1相比...

张凯乐
2016/12/30
255
3
个人面试提问企业必问的问题

我面试过不少人,到了提问企业环节,大部分人都没有自己整理一份好好的问题列表。今天我闲的蛋疼,就自己整理了一份。 http://www.timelog.xyz/tmv/32 大家就跳到我的网站观看吧。。。。 不要...

金拱门
2015/12/09
5.3K
50

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部