查看原文
其他

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

2017-05-12 如梦技术 开源中国

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


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




推荐阅读

最近 Python 有点火?  7 个学习它的理由!

假日照片堆积如何处理?这些工具你可能用得上

这些开源软件养活了一票国产软件!

40 行代码拿下拉勾网招聘数据

点击“阅读原文”查看更多精彩内容

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存