Tomcat如何在没有web.xml的情况下完全引导应用程序?

我想知道如何Tomcat在Spring MVC上引导我的应用程序?

我有一个初始化器:

public class AppInitializer implements WebApplicationInitializer {

@Override

public void onStartup(ServletContext container) {

AnnotationConfigWebApplicationContext rootCtx = new AnnotationConfigWebApplicationContext();

rootCtx.register(AppConfig.class);

container.addListener(new ContextLoaderListener(rootCtx));

AnnotationConfigWebApplicationContext dispatcherCtx = new AnnotationConfigWebApplicationContext();

dispatcherCtx.register(FreeMarkerWebConfig.class);

ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherCtx));

dispatcher.setLoadOnStartup(1);

dispatcher.addMapping("/");

}

}

我知道我们为什么需要web.xml以及如何Tomcat使用它来引导应用程序。但是我不明白Tomcat,如果没有xml文件(只有),怎么知道应该使用哪个servlet来引导应用程序AppAppInitializer

依存关系

<!-- spring mvc -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>4.2.1.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context-support</artifactId>

<version>4.2.1.RELEASE</version>

</dependency>

<!-- servlet -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.0.1</version>

</dependency>

...

我在Spring核心中找到了此类SpringServletContainerInitializerTomcat使用它来引导我的应用程序是否正确?

http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContainerInitializer.html?is-

external=true

回答:

Servlet

3.0添加了可插入性机制。它的工作方式是,在加载您的应用程序时,它将扫描类路径中名为javax.servlet.ServletContainerInitializerinside

的文件META-INF/services。在这里,实现者应该具有实现的名称,servlet容器可以在其中加载它。您可以在spring-

webjar中看到此文件。它org.springframework.web.SpringServletContainerInitializer列为初始化程序的实现。

Spring初始化程序的工作方式是,它WebApplicationInializer由servlet容器传递所有的实现(在类路径上)。那么servlet容器如何知道传递这些实现?如果查看inializer的源代码,将会看到

@HandlesTypes(WebApplicationInitializer.class)

public class SpringServletContainerInitializer implements ServletContainerInitializer {

它是@HandlesType注释。所有类

甚至注释1中列出的@HandlesTypes将获得由servlet容器拾起,并传递到SevletContainerInitializer通过一个回调方法参数

void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)

Set参数包含servlet容器在扫描时拾取的所有实现。您可以浏览源代码,以了解Spring对这些实现的作用。它基本上只是调用onStartup所有inializer的,并传入ServletContext


1.这听起来有点不清楚(上面的解释在切线上可能有点偏离),所以我将其作为附加内容发布在这里。想象一下,@HandlesType相反是

@HandlesTypes({WebApplicationInitializer.class, Controller.class})

public class SpringServletContainerInitializer implements ServletContainerInitializer {

这意味着servlet容器还将扫描用注释的类@Controller,并将它们传递到onStartupSpring初始化程序的。

以上是 Tomcat如何在没有web.xml的情况下完全引导应用程序? 的全部内容, 来源链接: utcz.com/qa/416607.html

回到顶部