使用ServletContainerInitializer动态注册组件
1.背景
在web容器(例如tomcat)启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等。对此servlet规范提供了ServletContainerInitializer来实现这个功能。
每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个ServletContainerInitializer实现类做一些组件内的初始化工作。
1.1 spring-web的实现
如图是spring框架使用ServletContainerInitializer的处理方法:
//service下面org.springframework.web.SpringServletContainerInitializer内容是ServletContainerInitializer的实现类:
org.springframework.web.SpringServletContainerInitializer
//点进去SpringServletContainerInitializer
@HandlesTypes(WebApplicationInitializer.class)//通过@HandlesTypes在onStartup方法执行的时候,把指定类的实现类(包括指定类本身)传递进去
public class SpringServletContainerInitializer implements ServletContainerInitializer {
...
public void onStartup()
...
}
1.2 动态注册servlet
可以在ServletContainerInitializer里面动态注册servlet(servlet3大组件),只限于容器启动时动态注册,出于安全性考虑无法在运行时动态注册。
@HandlesTypes({ JarWelcomeServlet.class })
public class CustomServletContainerInitializer implements
ServletContainerInitializer {
private static final Log log = LogFactory
.getLog(CustomServletContainerInitializer.class);
private static final String JAR_HELLO_URL = "/jarhello";
public void onStartup(Set<Class<?>> c, ServletContext servletContext)
throws ServletException {
log.info("CustomServletContainerInitializer is loaded here...");
log.info("now ready to add servlet : " + JarWelcomeServlet.class.getName());
ServletRegistration.Dynamic servlet = servletContext.addServlet(
JarWelcomeServlet.class.getSimpleName(),
JarWelcomeServlet.class);
servlet.addMapping(JAR_HELLO_URL);
log.info("now ready to add filter : " + JarWelcomeFilter.class.getName());
FilterRegistration.Dynamic filter = servletContext.addFilter(
JarWelcomeFilter.class.getSimpleName(), JarWelcomeFilter.class);
EnumSet<DispatcherType> dispatcherTypes = EnumSet
.allOf(DispatcherType.class);
dispatcherTypes.add(DispatcherType.REQUEST);
dispatcherTypes.add(DispatcherType.FORWARD);
filter.addMappingForUrlPatterns(dispatcherTypes, true, JAR_HELLO_URL);
log.info("now ready to add listener : " + JarWelcomeListener.class.getName());
servletContext.addListener(JarWelcomeListener.class);
}
}
使用ServletContainerInitializer动态注册组件的更多相关文章
- Angular动态注册组件(controller,service...)
使用angular的场景一般是应用类网站 这也意味着会有很多的controller,service,directive等等 正常情况下我们要把这些内容一次性下载并注册,由于文件较多,对首次加载的效率影 ...
- react根据传参的不同动态注册不同的子组件
上一篇文章介绍了关于Vue如何根据传参的不同动态注册不同的子组件,实现过程请查阅Vue.extend动态注册子组件,由Vue的这个功能我就自然联想到了使用react该如何实现同样的功能呢.其实,用re ...
- vue动态子组件的实现方式
让多个组件使用同一个挂载点,并动态切换,这就是动态组件. 通过使用保留的 <component>元素,动态地绑定到它的 is 特性,可以实现动态组件. 方式一:局部注册所需组件 <d ...
- .net比较完美的动态注册com组件
.net中经常需要使用com组件,怎么样注册com组件呢? 一般想到的当然是直接通过系统cmd 调用regsvr32注册程序去注册,如下: regsvr32 name.dll 在.net中可以直接执行 ...
- 插件占坑,四大组件动态注册前奏(三) 系统BroadCast的注册发送流程
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52204143 前言:为什么要了解系统Activity,Service,BroadCas ...
- 插件占坑,四大组件动态注册前奏(二) 系统Service的启动流程
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52203903 前言:为什么要了解系统Activity,Service,BroadCas ...
- 插件占坑,四大组件动态注册前奏(一) 系统Activity的启动流程
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52190050 前言:为什么要了解系统Activity,Service,,BroadCa ...
- Vue动态注册异步组件(非同一个工程的组件)
前言:最近在掘金逛的时候,无意中看到前滴滴前端架构黄轶大佬,看到了大佬分享的一篇博客滴滴 webapp 5.0 Vue 2.0 重构经验分享 ,对于其中第5个问题(异步加载的业务线组件,如何动态注册? ...
- Servlet - Upload、Download、Async、动态注册
Servlet 标签 : Java与Web Upload-上传 随着3.0版本的发布,文件上传终于成为Servlet规范的一项内置特性,不再依赖于像Commons FileUpload之类组件,因此在 ...
随机推荐
- WOJ 46 完全背包
高级的暴力,神仙优化…… 首先$O(n^{3})$的$dp$很好想,然后这样可以$O(1)$地回答询问. 考虑到所有物品的体积是一个连续的区间,所以说我们可以合并一些物品来达到预处理时间均摊的效果. ...
- 《Head First Servlets & JSP》-8-无脚本的JSP
以前servlet和JSP交互的代码 servlet代码示例: JSP代码示例: 若属性不是一个String而是一个Bean呢? 一个简单的JavaBean servlet代码示例: JSP代码示例: ...
- rf常用关键字
上传文件choose file 用法:choose file 元素定位 文件路径\\文件名 此处注意:复制的路径是/,需全部替换成\\ 清除Clear Element Tex ...
- angular 分页
http://jsfiddle.net/SAWsA/11/# <html xmlns:ng="http://angularjs.org" ng-app lang=" ...
- 网易云易盾中标浙报反作弊服务 助力浙江新闻App健康发展
欢迎访问网易云社区,了解更多网易技术产品运营经验. 近日,国内领先的智能业务安全平台网易云易盾和浙报传媒旗下"浙江新闻"达成合作,易盾将为浙江新闻客户端提供大数据反作弊服务,助力浙 ...
- 本地机器和windows2003远程桌面之间复制粘贴文件
打开远程桌面连接-->选项-->本地资源-->磁盘驱动器 前面打勾然后再连接就可以了.
- 787. Cheapest Flights Within K Stops
There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...
- weekly contest 115
958. Check Completeness of a Binary Tree Given a binary tree, determine if it is a complete binary t ...
- 「十二省联考 2019」异或粽子——tire树+堆
题目 [题目描述] 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅 ...
- js中的DOM对象 和 jQuery对象 比较
一,二者的区别 通过 jQuery 获取的元素是一个数组,数组中包含着原生JS中的DOM对象. 总结:jQuery 就是把 DOM 对象重新包装了一下,让其具有了 jQuery 方法. 二,二者的相互 ...