您好,登錄后才能下訂單哦!
怎么在Spring中通過Java對(duì)Tomcat進(jìn)行配置?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(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á)對(duì)某個(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); } } }
到此這篇關(guān)于Spring通過Java配置集成Tomcat的文章就介紹到這了,更多相關(guān)Spring配置集成Tomcat內(nèi)容請(qǐng)搜索億速云以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持億速云!
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。