gpt4 book ai didi

java - Tomcat 如何在没有 web.xml 的情况下准确引导应用程序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:07:49 25 4
gpt4 key购买 nike

我想知道 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 如何使用它来引导应用程序。但是我不明白如果没有 xml 文件,只有 AppAppInitializerTomcat 如何知道它应该使用哪个 servlet 来引导应用程序?

依赖关系

<!-- 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核心SpringServletContainerInitializer中找到了这个类。 Tomcat 使用它来引导我的应用程序是否正确?

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

最佳答案

Servlet 3.0 增加了可插拔机制。它的工作原理是,当您的应用程序加载时,Servlet 容器会扫描类路径以查找名为 javax.servlet.ServletContainerInitializer 的文件。里面META-INF/services .该文件的内容应该只是 Servlet 容器可以加载的初始化程序的实现名称。您可以在 spring-web 中看到此文件 jar 。它列出了 org.springframework.web.SpringServletContainerInitializer作为初始化器的实现。

Spring 初始化器是如何工作的,它传递了 WebApplicationInializer 的所有实现(在类路径上)。通过 Servlet 容器。那么Servlet容器是怎么知道传递这些实现的呢?如果您查看 source code for the inializer , 你会看到

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {

它是 @HandlesType注解。 @HandlesTypes 中列出的所有类 甚至注释1将被 servlet 容器拾取并传递给 SevletContainerInitializer通过单个回调方法参数

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

Set参数包含 Servlet 容器在扫描时拾取的所有实现。您可以查看源代码以了解 Spring 使用这些实现做了什么。它基本上只是调用 onStartup在所有初始化器中,传入 ServletContext .


<子>1。这听起来有点不清楚(并且上面的解释可能有点离题了)所以我只是把它作为额外的贴在这里。想象一下 @HandlesType取而代之的是

@HandlesTypes({WebApplicationInitializer.class, Controller.class})
public class SpringServletContainerInitializer implements ServletContainerInitializer {

这意味着 servlet 容器还将扫描用 @Controller 注释的类, 并将它们传递给 onStartup Spring 初始值设定项。

关于java - Tomcat 如何在没有 web.xml 的情况下准确引导应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32550131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com