Spring通過Java配置集成Tomcat的方法
添加Tomcat依賴
<!-- 自己編譯的版本-->
<dependency>
<groupId>org.apache</groupId>
<artifactId>apache-tomcat-9.0.36-src</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
首先需要一個tomcat啟動類
public class TomcatRun {
private static final int PORT = 8080;
private static final String CONTEXT_PATH = "/com/yu";
public static void main(String[] args) {
Tomcat tomcat = new Tomcat();
// 設置監(jiān)聽端口
tomcat.setPort(PORT);
tomcat.getHost().setAppBase(".");
// 這里 Connector 不存在,自動創(chuàng)建一個 Connector,并將 tomcat 的端口賦值給 Connector
tomcat.getConnector();
tomcat.addWebapp(CONTEXT_PATH, new File("src/main/webapp").getAbsolutePath());
try {
tomcat.start();
} catch (LifecycleException e) {
e.printStackTrace();
}
tomcat.getServer().await();
}
}
也可以自己創(chuàng)建一個Connector指定端口
// 手動創(chuàng)建 connector // Connector connector = new Connector(); // connector.setPort(PORT); // tomcat.getService().addConnector(connector);
創(chuàng)建Spring配置
public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{AppConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/*"};
}
@Override
protected Filter[] getServletFilters() {
return new Filter[]{
//
new CharacterEncodingFilter(StandardCharsets.UTF_8.name())
};
}
}
這里就結束了。。。
問題來了Tomcat是怎么啟動Sping的?
實現(xiàn)了Servlet3.0的容器(例如Tomcat)會掃描classpath*下面的META-INF/services/javax.servlet.ServletContainerInitializer文件,里面指定ServletContainerInitializer的實現(xiàn),另外還有一個注解HandlesTypes表達對某個類感興趣,在調用onStartup方法時會將HandlesTypes指定接口的實現(xiàn)類傳遞進來。
例如:Spring中的ServletContainerInitializer實現(xiàn)類SpringServletContainerInitializer會調用WebApplicationInitializer的onStartup方法,也就是上面定義的MyWebApplicationInitializer父類的onStartup,這里就會相繼完成AnnotationConfigWebApplicationContext和DispatcherServlet的初始化
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
throws ServletException {
List<WebApplicationInitializer> initializers = new LinkedList<>();
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)
ReflectionUtils.accessibleConstructor(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;
}
servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");
AnnotationAwareOrderComparator.sort(initializers);
for (WebApplicationInitializer initializer : initializers) {
// 調用WebApplicationInitializer實現(xiàn)類的onStartup方法
initializer.onStartup(servletContext);
}
}
}

到此這篇關于Spring通過Java配置集成Tomcat的文章就介紹到這了,更多相關Spring配置集成Tomcat內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java獲取Prometheus監(jiān)控數(shù)據(jù)的方法實現(xiàn)
本文主要介紹了Java獲取Prometheus監(jiān)控數(shù)據(jù)的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-12-12
Spring遠程調用HttpClient/RestTemplate的方法
這篇文章主要介紹了Spring遠程調用HttpClient/RestTemplate的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
java.imageIo給圖片添加水印的實現(xiàn)代碼
最近項目在做一個商城項目, 項目上的圖片要添加水?、?添加圖片水印;②:添加文字水印;一下提供下個方法,希望大家可以用得著2013-07-07

