专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
OSC开源社区  ·  100%国产AI新成员:壁仞科技成功适配De ... ·  4 天前  
程序员的那些事  ·  Rust ... ·  2 天前  
程序员小灰  ·  DeepSeek + IDEA!辅助编程太强了! ·  3 天前  
程序员的那些事  ·  趣图:“微软穷疯了?上架的 ... ·  4 天前  
OSC开源社区  ·  2024年中国开源模型:崛起与变革 ·  5 天前  
51好读  ›  专栏  ›  OSC开源社区

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

OSC开源社区  · 公众号  · 程序员  · 2017-05-12 08:29

正文

# 点击图片报名上海、南京源创会 #


目前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 > 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 前在“ 开源中国七大夏日必备编程神器,不容错过! ”评论区留言,写下你用过最好的开源项目和项目地址,并说明为什么觉得最好,点赞数最多的前十名即可获得开源中国送出的编程神器一份哦!!!




推荐阅读






请到「今天看啥」查看全文