您好,登录后才能下订单哦!
本文小编为大家详细介绍“Java中怎么把Spring配置集成Tomcat服务器”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中怎么把Spring配置集成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();
// 设置监听端口
tomcat.setPort(PORT);
tomcat.getHost().setAppBase(".");
// 这里 Connector 不存在,自动创建一个 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();
}
}
也可以自己创建一个Connector
指定端口
// 手动创建 connector
// Connector connector = new Connector();
// connector.setPort(PORT);
// tomcat.getService().addConnector(connector);
创建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
的?
实现了Servlet3.0的容器(例如Tomcat)会扫描classpath*下面的META-INF/services/javax.servlet.ServletContainerInitializer
文件,里面指定ServletContainerInitializer
的实现,另外还有一个注解HandlesTypes
表达对某个类感兴趣,在调用onStartup方法时会将HandlesTypes
指定接口的实现类传递进来。
例如:Spring
中的ServletContainerInitializer
实现类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实现类的onStartup方法
initializer.onStartup(servletContext);
}
}
}
读到这里,这篇“Java中怎么把Spring配置集成Tomcat服务器”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。