在上一篇《在应用程序中使用Spring启动嵌入式Jetty并让Web程序共享同一个Application Context(一)》 中介绍了其中的一种方法,下面再介绍另一种比较简单的方法。
这次我们不需要编写自己的 ContextLoader 和 ContextLoaderListener。也不需要在 web.xml 里配置 spring,我们会直接将 application context 传递给 jetty 内部。
首先要确保 web.xml 里不出现如下的配置代码
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
然后编写一个用于启动 Jetty 的类
package com.test;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.webapp.WebAppContext;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
/*
To embed a Jetty server, the following steps are typical:
1. Create the server
2. Add/Configure Connectors
3. Add/Configure Handlers
4. Add/Configure Servlets/Webapps to Handlers
5. start the server
6. wait (join the server to prevent main exiting).
*/
public class JettyDaemon implements ApplicationContextAware{
private Server server;
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void start() throws Exception{
server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(8080);
server.addConnector(connector);
WebAppContext webAppContext = new WebAppContext();
webAppContext.setContextPath("/");
webAppContext.setDescriptor("web/WEB-INF/web.xml");
webAppContext.setResourceBase("web");
webAppContext.setConfigurationDiscovered(true);
webAppContext.setParentLoaderPriority(true);
server.setHandler(webAppContext);
// 以下代码是关键
webAppContext.setClassLoader(applicationContext.getClassLoader());
XmlWebApplicationContext xmlWebAppContext = new XmlWebApplicationContext();
xmlWebAppContext.setParent(applicationContext);
xmlWebAppContext.setConfigLocation("");
xmlWebAppContext.setServletContext(webAppContext.getServletContext());
xmlWebAppContext.refresh();
webAppContext.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
xmlWebAppContext);
server.start();
}
}
要注意这个类必须实现 ApplicationContextAware 接口,以让 spring 把 application context 设置进来,同时从上面的代码可以看到其实我们自己创建了 XmlWebApplicationContext 并把它传入 webAppContext 的 attribute 集合。
要主要这个类不要 new 并且执行,而是让 applicationContext 配置它并且执行它。
applicationContext.xml 的部分配置代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" … … … … … …>
<!-- daemons -->
<bean id="webDaemon" class="com.test.JettyDaemon" init-method="start" />
… … … … … …
现在应用程序的 main() 方法里面只需加载 Spring context 即可,其他的所有工作就让 Spring 来完成吧。
public static void main(String[] args){
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
applicationContext.registerShutdownHook();
}
注:这里的 Jetty 的版本是 7.0.2
分享到:
相关推荐
Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的创建和开发流程。它通过自动配置和一站式的解决方案,让开发者能够更快速地构建高质量的应用。以下是对 Spring Boot 的详细解析: 一、...
- **`@SpringBootApplication`**:这是一个组合注解,它包含了 `@Configuration`、`@EnableAutoConfiguration` 和 `@ComponentScan`,用于标记主配置类,简化 Spring Boot 应用程序的配置。 - **配置文件**: - ...
在Spring Boot框架中,内置的Web服务器如Tomcat或Jetty极大地简化了开发和部署Java Web应用程序的过程。Spring Boot的设计理念是"约定优于配置",它默认使用内建的Web服务器,但有时根据项目需求,我们可能需要切换...
- Red5标准部署通常作为独立的Java应用程序,内嵌了一个J2EE容器(如Jetty或Tomcat),并作为一个系统服务运行。 - **WAR版本** 的Red5则运行在外部的J2EE容器内部,例如Tomcat。 ##### 2. Tomcat部署器的工作原理 ...
Spring Boot 2.0 是一个流行的框架,用于快速构建独立的、生产级别的基于 Spring 的应用程序。随着网络安全越来越受到重视,如何使 Spring Boot 应用支持 HTTPS 成为了开发者们关注的重点。本文将详细介绍如何在 ...
在本项目"SpringBoot+Maven集成demo"中,我们主要关注的是如何将Spring Boot框架与Maven构建工具相结合,实现一个包含Quartz定时任务管理的简单应用。这个项目是针对Java开发者的,旨在演示如何在Spring Boot环境中...
在Spring Boot框架中,`spring-boot-starter-web`是一个核心模块,它包含了处理Web应用程序的基本依赖,其中默认的嵌入式Servlet容器是Tomcat。然而,根据项目需求,你可能希望使用其他的Servlet容器,例如Jetty。...
SpringBoot 是一个基于 Spring 框架的简化版,旨在简化 Spring 应用程序的初始设置和常规配置。它在现有 Spring 框架的基础上构建,以减少开发者的繁琐工作,比如添加依赖、配置服务器和处理版本冲突。通过 ...
5. **命令行接口(CLI)**:用于快速启动和运行Spring应用程序。 **Quartz Scheduler介绍** Quartz Scheduler是一款开源的工作调度框架,它允许程序在指定的时间执行任务。Quartz支持 cron 表达式,可以实现定时...
**开发第一个Spring Boot应用程序** 1. 在配置文件`application.properties`或`application.yml`中设置服务器端口和上下文路径,例如: ```properties server.port=8088 servlet.context-path=/your-context-path...