`
TRAMP_ZZY
  • 浏览: 138811 次
社区版块
存档分类
最新评论

ServletContainerInitializer 初始化器

阅读更多
概述
为了实现不通过web.xml 启动JavaEE项目,容器提供了javax.servlet.ServletContainerInitializer。第三方的应用需要基于SPI机制,来实现javax.servlet.ServletContainerInitializer 接口。也就是需要在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个初始化器做一些组件内的初始化工作。
一般伴随着ServletContainerInitializer一起使用的还有HandlesTypes注解,通过HandlesTypes可以将感兴趣的一些类注入到ServletContainerInitializerde的onStartup方法作为参数传入。


自定义实现
1. 自定义SpringServletContainerInitializer 类
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {

    @Override
    public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext ctx) throws ServletException {

        List<WebApplicationInitializer> initializers = new LinkedList<>();

        if (webAppInitializerClasses != null) {
            for (Class<?> waiClass : webAppInitializerClasses) {
                // TODO
            }
        }
    }
}

2. 在MEAT-INF中添加实现类信息。






Spring 中的实现

1. 定义实现ServletContainerInitializer的类
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {

	/**
	 * Delegate the {@code ServletContext} to any {@link WebApplicationInitializer}
	 * implementations present on the application classpath.
	 *
	 * <p>Because this class declares @{@code HandlesTypes(WebApplicationInitializer.class)},
	 * Servlet 3.0+ containers will automatically scan the classpath for implementations
	 * of Spring's {@code WebApplicationInitializer} interface and provide the set of all
	 * such types to the {@code webAppInitializerClasses} parameter of this method.
	 *
	 * <p>If no {@code WebApplicationInitializer} implementations are found on the
	 * classpath, this method is effectively a no-op. An INFO-level log message will be
	 * issued notifying the user that the {@code ServletContainerInitializer} has indeed
	 * been invoked but that no {@code WebApplicationInitializer} implementations were
	 * found.
	 *
	 * <p>Assuming that one or more {@code WebApplicationInitializer} types are detected,
	 * they will be instantiated (and <em>sorted</em> if the @{@link
	 * org.springframework.core.annotation.Order @Order} annotation is present or
	 * the {@link org.springframework.core.Ordered Ordered} interface has been
	 * implemented). Then the {@link WebApplicationInitializer#onStartup(ServletContext)}
	 * method will be invoked on each instance, delegating the {@code ServletContext} such
	 * that each instance may register and configure servlets such as Spring's
	 * {@code DispatcherServlet}, listeners such as Spring's {@code ContextLoaderListener},
	 * or any other Servlet API componentry such as filters.
	 *
	 * @param webAppInitializerClasses all implementations of
	 * {@link WebApplicationInitializer} found on the application classpath
	 * @param servletContext the servlet context to be initialized
	 * @see WebApplicationInitializer#onStartup(ServletContext)
	 * @see AnnotationAwareOrderComparator
	 */
	@Override
	public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
			throws ServletException {

		List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();

		if (webAppInitializerClasses != null) {
			for (Class<?> waiClass : webAppInitializerClasses) {
				// Be defensive: Some servlet containers provide us with invalid classes,
				// no matter what @HandlesTypes says...
				if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
						WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
					try {
						initializers.add((WebApplicationInitializer) waiClass.newInstance());
					}
					catch (Throwable ex) {
						throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
					}
				}
			}
		}

		if (initializers.isEmpty()) {
			servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
			return;
		}

		AnnotationAwareOrderComparator.sort(initializers);
		servletContext.log("Spring WebApplicationInitializers detected on classpath: " + initializers);

		for (WebApplicationInitializer initializer : initializers) {
			initializer.onStartup(servletContext);
		}
	}

}



2. META-INF 中添加







总结


Spring 提供的SpringServletContainerInitializer 是ServletContainerInitializer 接口真正的实现类,但是Spring另外定义了WebApplicationInitializer 接口作为真正的启动接口,Spring 对该接口的实现都是抽象类,因此在上面方法中过滤时,都被丢弃。






引用


  • http://blog.csdn.net/wangyangzhizhou/article/details/52013779



  • 大小: 4.6 KB
  • 大小: 10.2 KB
  • 大小: 26.9 KB
分享到:
评论

相关推荐

    过滤器Filter的全面解析

    - `init(FilterConfig config)`: 初始化方法,当过滤器被加载时调用,可以在这里进行初始化设置。 - `doFilter(ServletRequest request, ServletResponse response, FilterChain chain)`: 执行过滤操作的方法,每...

    过滤器filter

    1. **初始化(init())**:当服务器加载过滤器时,会调用filter.init(FilterConfig config)方法进行初始化,此时可以获取filter-config元素中的初始化参数。 2. **执行(doFilter())**:每次请求经过过滤器时,...

    Servlet、Filter、Listener深入理解.docx

    1. `init(ServletConfig config)`: 在Servlet实例化后,由Servlet容器调用,用于初始化Servlet对象,如设置配置、打开数据库连接等。`ServletConfig`对象提供了初始化参数和Servlet上下文信息。 2. `...

    servlet3.1

    通过`ServletContainerInitializer`接口,可以实现自定义的初始化逻辑,动态添加或修改Web组件。 8. **资源注入**: Servlet 3.1支持JSR 330的依赖注入标准,允许将其他组件(如`@Inject`注解的字段或方法参数)...

    servlet资料API 原版教程 实例

    在Servlet API中,`ServletContainerInitializer`接口允许自定义的初始化过程。通过实现这个接口并注册到JAR的META-INF/services目录下,可以在应用启动时执行特定的初始化逻辑。 六、Servlet 3.0及以上版本的新...

    servlet用到的类

    8. **ServletContainerInitializer接口**:Java EE 6引入的新特性,允许开发者自定义Servlet容器初始化过程。通过实现此接口,可以在Web应用启动时执行特定的初始化逻辑。 9. **Filter接口和FilterChain类**:...

    servlet相关资料介绍.zip

    3. ServletContainerInitializer:允许开发者定义自己的初始化处理器,以便在Web应用启动时执行特定的配置逻辑。 六、实战应用 Servlet广泛应用于各种Web应用中,如登录验证、数据处理、文件上传下载、RESTful API...

    Servlet常用接口

    7. `ServletContainerInitializer`是Java EE 6引入的,它允许开发者在Web应用启动时执行自定义初始化代码,无需在web.xml中配置。 8. 在实际开发中,我们通常会继承`GenericServlet`或`HttpServlet`,前者实现了...

    Spring注解驱动开发.pdf

    - **`ServletContainerInitializer`**:可以在Servlet容器启动时初始化资源。 - **异步请求处理**:通过`Callable`或`DeferredResult`等API实现异步处理。 通过上述知识点的介绍,可以看出Spring框架通过强大的注解...

    servlet类库

    9. **ServletContainerInitializer接口**:在Servlet 3.0及以上版本中引入,允许自定义初始化代码,当应用启动时自动执行。 使用这个压缩包,你可以直接查看Servlet API的源代码,理解其实现细节,这对于深入学习...

    Servlet2.4 api 帮助文档

    2. 初始化:Servlet被加载后,会调用init()方法进行初始化,通常用于设置Servlet的初始状态。 3. 服务:当接收到HTTP请求时,Servlet容器会调用service()方法处理请求。service()方法会根据请求类型(GET、POST等)...

    servlet api 源码jar包 Mac版

    例如,你可以研究`HttpServletRequest`和`HttpServletResponse`是如何处理HTTP请求和响应的,或者`ServletContainerInitializer`是如何进行自定义初始化的。 7. **版本兼容性**: 虽然这个jar包是Servlet 2.5版本...

    基于servlet3.1,实现模块化扩展.zip

    7. **上下文感知的初始化参数**:在Servlet 3.1中,开发者可以通过`@WebInitParam`注解在Servlet类上定义初始化参数,这些参数可以针对特定的Servlet实例,而不是整个Web应用。 8. **动态注册**:在运行时,可以...

    servlet入门

    此外,`ServletContainerInitializer`接口和`javax.servlet.Servlet`类也值得研究,它们负责Servlet的加载和初始化过程。 6. **工具支持** 在实际开发中,通常使用IDE如Eclipse、IntelliJ IDEA等进行Servlet开发,...

    servlet源码

    此外,`ServletContainerInitializer`接口允许自定义初始化逻辑,以便在容器启动时执行特定的任务。 异步处理是Servlet 3.0的另一个重要特性,通过`AsyncContext`接口实现。它允许Servlet在不阻塞线程的情况下处理...

    SpringBoot启动及自动装配原理过程详解

    但是可以将它配置为随容器启动而初始化,在 DispatcherServlet 初始化过程中去读取 springMVC.xml 配置文件,完成 controller 映射、视图解析、参数解析等工作。 三、Servlet3 Servlet3 规定,如果在当前项目的 ...

    深入学习JavaServlet开发与实例,搞这块儿的同志下吧

    7. **监听器(Listener)**:监听器用于监听Web应用中的特定事件,如session的创建、销毁,以及ServletContext的初始化和销毁。 8. **MVC模式**:虽然Servlet本身不强制遵循任何设计模式,但通常与Model-View-...

    springboot启动周期流程

    1. **初始化阶段**: - **引导加载器(Bootstrap ClassLoader)**:SpringBoot应用的启动是从`main`方法开始的,这个方法通常位于一个`SpringBootApplication`类型的类中。执行`SpringApplication.run()`会启动引导...

    java.servlet.jar

    8. **ServletContextListener接口**和`ServletContainerInitializer`接口:允许监听Web应用的启动和停止事件,进行初始化和清理工作。 9. **ServletRegistration和ServletRegistration.Dynamic**:用于注册Servlet...

    SpringBoot注册Servlet的三种方法详解

    然后在`META-INF/services/javax.servlet.ServletContainerInitializer`文件中添加自定义初始化器的全限定类名,以便Servlet容器在启动时加载。 ### 注册Filter和Listener 注册Filter和Listener与注册Servlet类似...

Global site tag (gtag.js) - Google Analytics