我想知道如何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("/");
}
}
Run Code Online (Sandbox Code Playgroud)
我知道为什么我们需要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>
...
Run Code Online (Sandbox Code Playgroud)
我在Spring核心中找到了这个类SpringServletContainerInitializer.Tomcat使用它来引导我的应用程序是否正确?
http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContainerInitializer.html?is-external=true
Pau*_*tha 19
Servlet 3.0增加了可插拔性机制.它是如何工作的,当你的应用程序加载时,它会扫描类路径中的javax.servlet.ServletContainerInitializer内部文件META-INF/services.在那里,实现者应该具有实现的名称,servlet容器可以在其中加载它.你可以在spring-webjar中看到这个文件.它列出org.springframework.web.SpringServletContainerInitializer了初始化程序的实现.
Spring初始化程序的工作原理是,它传递WebApplicationInializer了servlet容器的所有实现(在类路径上).那么servlet容器如何知道通过这些实现呢?如果你看一下inializer的源代码,你会看到
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
Run Code Online (Sandbox Code Playgroud)
这是@HandlesType注释.所有类和甚至注释1中列出的@HandlesTypes将获得由servlet容器拾起,并传递到SevletContainerInitializer通过一个回调方法参数
void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)
Run Code Online (Sandbox Code Playgroud)
该Set参数包含servlet容器在扫描时拾取的所有实现.您可以查看源代码以了解Spring对这些实现的作用.它基本上只调用onStartup所有的inializers,传入ServletContext.
1.这听起来有点不清楚(上面解释它在切线上会有点偏差)所以我只是在这里发布一个额外的.想象一下@HandlesType相反的是
@HandlesTypes({WebApplicationInitializer.class, Controller.class})
public class SpringServletContainerInitializer implements ServletContainerInitializer {
Run Code Online (Sandbox Code Playgroud)
这意味着servlet容器还将扫描带有注释的类@Controller,并将它们传递onStartup给Spring初始化程序.
| 归档时间: |
|
| 查看次数: |
2494 次 |
| 最近记录: |