springMVC工程使用jreloader实现热部署
springMVC工程使用jreloader实现热部署
applicationContext - ContextLoaderListener重新加载
DispatcherServlet 重新加载
提高开发效率
1: jreloader 是class的热加载器
(1) 从网上下载jreloaderjar包
(2) 在运行配置中的vm参数中添加
-noverify -javaagent:./jreloader.jar - Djreloader.dirs=./target/classes
Djreloader.dirs 是class的路径,多个路径使用逗号隔开
2:继承org.springframework.web.context.ContextLoaderListener重写contextInitialized的方法
import javax.servlet.ServletContextEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractRefreshableApplicationContext;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class WebContextListener extends ContextLoaderListener {
private static Logger logger = LoggerFactory.getLogger("Init");
public static ApplicationContext applicationContext;
public static ServletContextEvent servletContextEvent;
/**
* 获取spring 初始化的bean
*
* @param name
* @param requiredType
* @return
* @throws Exception
*/
public static T getBean(String name, Class requiredType)
throws Exception {
return applicationContext.getBean(name, requiredType);
}
/**
* 获取属性bean
*
* @param name
* @return
* @throws Exception
*/
public static Object getBean(String name) throws Exception {
return applicationContext.getBean(name);
}
@Override
public void contextInitialized(ServletContextEvent event) {
/** 初始化bean **/
super.contextInitialized(event);
/** 初始化context 和event **/
applicationContext = WebApplicationContextUtils
.getRequiredWebApplicationContext(event.getServletContext());
servletContextEvent = event;
/** 打印SUCCESS图案 **/
logger.info("*******************");
logger.info("**---------------**");
logger.info("**--***********--**");
logger.info("**--*---------*--**");
logger.info("**--*-SUCCESS-*--**");
logger.info("**--*---------*--**");
logger.info("**--***********--**");
logger.info("**---------------**");
logger.info("*******************");
}
/**
* applicationContext的reload
*/
public static void reloadApplicationContext() {
AbstractRefreshableApplicationContext abstractRefreshableApplicationContext = (AbstractRefreshableApplicationContext) applicationContext;
logger.info("start refresh the application context");
abstractRefreshableApplicationContext.refresh();
/** 打印SUCCESS图案 **/
logger.info("*******************");
logger.info("**---------------**");
logger.info("**--***********--**");
logger.info("**--*-REFRESH-*--**");
logger.info("**--*---------*--**");
logger.info("**--*-SUCCESS-*--**");
logger.info("**--***********--**");
logger.info("**---------------**");
logger.info("*******************");
logger.info("reload the application context success");
}
}
3:继承org.springframework.web.servlet.DispatcherServlet,添加refreshes方法,重写init方法
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.DispatcherServlet;
public class MVCServlet extends DispatcherServlet {
private static final long serialVersionUID = 1L;
private static MVCServlet servlet;
private static Logger logger = LoggerFactory.getLogger("Init");
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
servlet = this;
/** 打印SUCCESS图案 **/
logger.info("*******************");
logger.info("**---------------**");
logger.info("**--***********--**");
logger.info("**--*---------*--**");
logger.info("**--*-SUCCESS-*--**");
logger.info("**--*---------*--**");
logger.info("**--***********--**");
logger.info("**---------------**");
logger.info("*******************");
}
public static void refreshes(){
servlet.refresh();
}
}
4:添加重载的Controller
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ustcinfo.edi.datacfg.web.listener.WebContextListener;
import com.ustcinfo.edi.datacfg.web.servlet.MVCServlet;
@Controller
@RequestMapping("/reload")
public class ReloadController {
@ResponseBody
@RequestMapping("/reloadSpringController")
public String reloadSpringController() {
MVCServlet.refreshes();
return "success";
}
@ResponseBody
@RequestMapping("/reloadSpringContext")
public String reloadSpringContext() {
WebContextListener.reloadApplicationContext();
return "success";
}
}
5: 修改web.xml里面listener和servlet指向的class是上面两个重载的类
通过以上5个步骤,使用jreloader实现JVM中class的热加载,通过继承 org.springframework.web.context.ContextLoaderListener可以细线spring的配置bean的重载,通过继承org.springframework.web.servlet.DispatcherServlet,实现所有的Controller的重载,这样在开发过程中就可以完全实现热部署,不需要频繁的启动。重载的方法就是在浏览器里面输入那两个Controller的路径。
在一些大的工程中,启动一次耗费的代价太大,有的需要几分钟,一天的开发中需要频繁的重启,8个小时有1个小时在等待,通过上面的5个步骤可以实现热部署,一天节省1个小时的等待时间,提高开发的效率是很有必要的。
springMVC工程使用jreloader实现热部署的更多相关文章
- maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器
spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.相关Blog: 点击打开链接 原理是在发现代码有更改之后,重新启动应用 ...
- Eclipse - 安装 run-jetty-run 插件及使用 jrebel 热部署
安装 run-jetty-run 插件 1. 下载 run-jetty-run 2. 解压至 Eclipse/MyEclipse 安装目录下的 plugin 3. 右键 web 项工程,选择 Run ...
- springmvc如何进行热部署开发
1.场景还原 在工程量大的情况下,tomcat运行部署一次会花费相当多的时间,这样太 浪费人力以及时间了:今天笔者将 讲解一下如何配置springmvc工程的热部署 2.实现方案 其实很简单! ①在t ...
- 在eclipse中使用Maven分模块搭建SSM框架,创建jar、war、pom工程模块教学,项目的热部署,需要的可以留下邮箱,给大家发整理过的Maven笔记
第一章:Maven概述 (1)Maven是一个项目构建工具,由apache提供,用Java开发的 (2)构建工具:Ant(蚂蚁),Maven(专家) (3)构建工具作用:帮助程序员进行项目的创建,目录 ...
- Jrebel简单的热部署一个web工程
前言:博主最近在做Hybris开发,漫长的启动时间大大的拖累了项目的进度,而Jrebel的出现就是为了减少项目重启的时间或者说修改了代码后直接不用重启就可以看到修改的结果,但是Hybris的部署一直没 ...
- 基于tomcat插件的maven多模块工程热部署(附插件源码)
内容属原创,转载请注明出处 写在前面的话 最近一直比较纠结,归根结底在于工程的模块化拆分.以前也干过这事,但是一直对以前的结果不满意,这会重操旧业,希望搞出个自己满意的结果. 之前有什么不满意的呢? ...
- SpringBoot工程+热部署进行远程调试
本文转载自:https://blog.csdn.net/qq_31868349/article/details/78553901 SpringBoot工程+热部署进行远程调试 本地端添加配置 在pom ...
- Tomcat热部署,Web工程中线程没有终止
近期项目中,用 jenkins 热部署 web工程时,发现工程中静态持有的线程(将ScheduledExecutorService定时任务存储在静态Map中),导致不定时出现数据库访问事务关闭异常,如 ...
- SpringBoot工程热部署
SpringBoot工程热部署 1.在pom文件中添加热部署依赖 <!-- 热部署配置 --> <dependency> <groupId>org.springfr ...
随机推荐
- 【自动化测试】selenium之 chromedriver与chrome版本映射表
chromedriver版本 支持的Chrome版本 v2.30 v58-60 v2.29 v56-58 v2.28 v55-57 v2.27 v54-56 v2.26 v53-55 v2.25 v5 ...
- [转]JS组件系列——表格组件神器:bootstrap table
原文地址:https://www.cnblogs.com/landeanfen/p/4976838.html 前言:之前一直在忙着各种什么效果,殊不知最基础的Bootstrap Table用法都没有涉 ...
- 如何让docker以daemon方式运行/bin/bash
本文转自:https://segmentfault.com/q/1010000000424935 问题: 我想在docker run的时候,用-d参数运行/bin/bash,然后让这个bash一直跑着 ...
- Java编程的逻辑 (30) - 剖析StringBuilder
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Java编程的逻辑 (29) - 剖析String
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- linux进程管理(四)
[教程主题]:进程管理 [1]进程介绍 程序和进程 程序是为了完成某种任务而设计的软件,比如OpenOffice是程序.什么是进程呢?进程就是运行中的程序. 一个运行着的程序,可能有多个进程. 比如自 ...
- python多线程同步机制condition
#!/usr/bin/env python# -*- coding: utf-8 -*- import threadingimport time def customer(cond): t = thr ...
- 《Scrum实战》读书会作业01 - 用知行视角总结现在或者过去的一个项目
下面是<Scrum实战>读书会的第1个作业,主要是用知行视角来总结回顾现在或者过去的一个项目. 项目背景 2011年初,我做的项目是一个搜索引擎相关的项目,这个项目为公司在全球范围内的金融 ...
- HotSpot JVM常用参数(选项)设置
本文讨论的选项是针对HotSpot虚拟机的. 1.选项分类及语法 HotspotJVM提供以下三大类选项: 1.1.标准选项 这类选项的功能是很稳定的,在后续版本中也不太会发生变化. 运行java或者 ...
- http://www.gasi.ch/blog/inside-deep-zoom-1/
In March 2007 Blaise Aguera y Arcas presented Seadragon & Photosynth at TED that created quite s ...