您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Java中怎么把Spring配置集成Tomcat服務(wù)器”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java中怎么把Spring配置集成Tomcat服務(wù)器”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
添加Tomcat
依賴
<!-- 自己編譯的版本-->
<dependency>
<groupId>org.apache</groupId>
<artifactId>apache-tomcat-9.0.36-src</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
首先需要一個(gè)tomcat
啟動(dòng)類
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();
// 設(shè)置監(jiān)聽端口
tomcat.setPort(PORT);
tomcat.getHost().setAppBase(".");
// 這里 Connector 不存在,自動(dòng)創(chuàng)建一個(gè) 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)建一個(gè)Connector
指定端口
// 手動(dòng)創(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())
};
}
}
這里就結(jié)束了。。。
問題來了Tomcat
是怎么啟動(dòng)Sping
的?
實(shí)現(xiàn)了Servlet3.0的容器(例如Tomcat)會(huì)掃描classpath*下面的META-INF/services/javax.servlet.ServletContainerInitializer
文件,里面指定ServletContainerInitializer
的實(shí)現(xiàn),另外還有一個(gè)注解HandlesTypes
表達(dá)對某個(gè)類感興趣,在調(diào)用onStartup方法時(shí)會(huì)將HandlesTypes
指定接口的實(shí)現(xiàn)類傳遞進(jìn)來。
例如:Spring
中的ServletContainerInitializer
實(shí)現(xiàn)類SpringServletContainerInitializer
會(huì)調(diào)用WebApplicationInitializer
的onStartup
方法,也就是上面定義的MyWebApplicationInitializer
父類的onStartup
,這里就會(huì)相繼完成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) {
// 調(diào)用WebApplicationInitializer實(shí)現(xiàn)類的onStartup方法
initializer.onStartup(servletContext);
}
}
}
讀到這里,這篇“Java中怎么把Spring配置集成Tomcat服務(wù)器”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。