`

在应用程序中使用Spring启动嵌入式Jetty并让Web程序共享同一个Application Context(二)

阅读更多

在上一篇《在应用程序中使用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使用文档

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的创建和开发流程。它通过自动配置和一站式的解决方案,让开发者能够更快速地构建高质量的应用。以下是对 Spring Boot 的详细解析: 一、...

    spring boot.docx

    - **`@SpringBootApplication`**:这是一个组合注解,它包含了 `@Configuration`、`@EnableAutoConfiguration` 和 `@ComponentScan`,用于标记主配置类,简化 Spring Boot 应用程序的配置。 - **配置文件**: - ...

    switchBuiltInServers.rar

    在Spring Boot框架中,内置的Web服务器如Tomcat或Jetty极大地简化了开发和部署Java Web应用程序的过程。Spring Boot的设计理念是"约定优于配置",它默认使用内建的Web服务器,但有时根据项目需求,我们可能需要切换...

    Red5 War.pdf 官方英文参考文档

    - Red5标准部署通常作为独立的Java应用程序,内嵌了一个J2EE容器(如Jetty或Tomcat),并作为一个系统服务运行。 - **WAR版本** 的Red5则运行在外部的J2EE容器内部,例如Tomcat。 ##### 2. Tomcat部署器的工作原理 ...

    springboot2.0发布代码时支持https

    Spring Boot 2.0 是一个流行的框架,用于快速构建独立的、生产级别的基于 Spring 的应用程序。随着网络安全越来越受到重视,如何使 Spring Boot 应用支持 HTTPS 成为了开发者们关注的重点。本文将详细介绍如何在 ...

    SpringBoot+Maven集成demo

    在本项目"SpringBoot+Maven集成demo"中,我们主要关注的是如何将Spring Boot框架与Maven构建工具相结合,实现一个包含Quartz定时任务管理的简单应用。这个项目是针对Java开发者的,旨在演示如何在Spring Boot环境中...

    spring-boot-starter-web更换默认Tomcat容器的方法

    在Spring Boot框架中,`spring-boot-starter-web`是一个核心模块,它包含了处理Web应用程序的基本依赖,其中默认的嵌入式Servlet容器是Tomcat。然而,根据项目需求,你可能希望使用其他的Servlet容器,例如Jetty。...

    SpringBoot 31道面试题和答案.docx

    SpringBoot 是一个基于 Spring 框架的简化版,旨在简化 Spring 应用程序的初始设置和常规配置。它在现有 Spring 框架的基础上构建,以减少开发者的繁琐工作,比如添加依赖、配置服务器和处理版本冲突。通过 ...

    crystal-demo:用于Spring Boot 2和Quartz Scheduler集成的演示项目

    5. **命令行接口(CLI)**:用于快速启动和运行Spring应用程序。 **Quartz Scheduler介绍** Quartz Scheduler是一款开源的工作调度框架,它允许程序在指定的时间执行任务。Quartz支持 cron 表达式,可以实现定时...

    SpringBoot项目的快速创建以及简单访问html网页

    **开发第一个Spring Boot应用程序** 1. 在配置文件`application.properties`或`application.yml`中设置服务器端口和上下文路径,例如: ```properties server.port=8088 servlet.context-path=/your-context-path...

Global site tag (gtag.js) - Google Analytics