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实现热部署的更多相关文章

  1. maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器

    spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.相关Blog: 点击打开链接 原理是在发现代码有更改之后,重新启动应用 ...

  2. Eclipse - 安装 run-jetty-run 插件及使用 jrebel 热部署

    安装 run-jetty-run 插件 1. 下载 run-jetty-run 2. 解压至 Eclipse/MyEclipse 安装目录下的 plugin 3. 右键 web 项工程,选择 Run ...

  3. springmvc如何进行热部署开发

    1.场景还原 在工程量大的情况下,tomcat运行部署一次会花费相当多的时间,这样太 浪费人力以及时间了:今天笔者将 讲解一下如何配置springmvc工程的热部署 2.实现方案 其实很简单! ①在t ...

  4. 在eclipse中使用Maven分模块搭建SSM框架,创建jar、war、pom工程模块教学,项目的热部署,需要的可以留下邮箱,给大家发整理过的Maven笔记

    第一章:Maven概述 (1)Maven是一个项目构建工具,由apache提供,用Java开发的 (2)构建工具:Ant(蚂蚁),Maven(专家) (3)构建工具作用:帮助程序员进行项目的创建,目录 ...

  5. Jrebel简单的热部署一个web工程

    前言:博主最近在做Hybris开发,漫长的启动时间大大的拖累了项目的进度,而Jrebel的出现就是为了减少项目重启的时间或者说修改了代码后直接不用重启就可以看到修改的结果,但是Hybris的部署一直没 ...

  6. 基于tomcat插件的maven多模块工程热部署(附插件源码)

    内容属原创,转载请注明出处 写在前面的话 最近一直比较纠结,归根结底在于工程的模块化拆分.以前也干过这事,但是一直对以前的结果不满意,这会重操旧业,希望搞出个自己满意的结果. 之前有什么不满意的呢? ...

  7. SpringBoot工程+热部署进行远程调试

    本文转载自:https://blog.csdn.net/qq_31868349/article/details/78553901 SpringBoot工程+热部署进行远程调试 本地端添加配置 在pom ...

  8. Tomcat热部署,Web工程中线程没有终止

    近期项目中,用 jenkins 热部署 web工程时,发现工程中静态持有的线程(将ScheduledExecutorService定时任务存储在静态Map中),导致不定时出现数据库访问事务关闭异常,如 ...

  9. SpringBoot工程热部署

    SpringBoot工程热部署 1.在pom文件中添加热部署依赖 <!-- 热部署配置 --> <dependency> <groupId>org.springfr ...

随机推荐

  1. java好用的邮件发送

    1.action代码 // 发送邮件 String strEMAIL = Tools.readTxtFile(Const.EMAIL); //读取邮件配置 String strEM[] = strEM ...

  2. Spring-boot 启动完成时执行指定任务

    在服务启动完成时,如果需要执行一些特定的预加载任务,则可以通过实现 CommandLineRunner 接口来实现. 实现 @Component public class Started implem ...

  3. win 安装pip和requests

    下载地址是:https://pypi.python.org/pypi/pip#downloads : 下载完成之后,解压到一个文件夹,用CMD控制台进入解压目录,输入: python setup.py ...

  4. Extjs4.x Tree树刷新,默认选中展开到最后一次选中的节点

    跟Extjs3.0不同Extjs4.2的写法如下: idPath = selNode.getPath("id"); tree.getStore().load({ node: tre ...

  5. android开发(43) 动画演示,会跑的小人,从屏幕左侧跑到右侧

    想做一个动画,一个会跑的小人,从屏幕右侧跑道右侧,于是做了个尝试,上图: 要完成这样需要三步: 1. 做一个 帧动画 (frame animation),由多张图片组成,组成小人连续跑动的样子. 2. ...

  6. 配置nginx

    咱不玩服务器,只在把人家的配置拷贝一份,建个自己的测试服务器 1. 如果nginx已配置(相当于windows在环境变量中配置了path吧) 查找nginx配置路径: whereis nginx 一般 ...

  7. 判断Json字符串返回类型 对象 或者 数组

    public enum JSON_TYPE { /** * JSONObject */ JSON_TYPE_OBJECT, /** * JSONArray */ JSON_TYPE_ARRAY, /* ...

  8. STM32的TAMPER-RTC管脚作为Tamper的使用[转]

    问题一: 当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件.侵入检测事件将所有数据备份寄存器内容清除.   然而为了 ...

  9. Hadoop HDFS分布式文件系统 常用命令汇总

    引言:我们维护hadoop系统的时候,必不可少需要对HDFS分布式文件系统做操作,例如拷贝一个文件/目录,查看HDFS文件系统目录下的内容,删除HDFS文件系统中的内容(文件/目录),还有HDFS管理 ...

  10. Airtest 网易 UI 自动化工具 Airtest 浅用记录

    一 使用目的 该工具主要是面向游戏UI测试基于图像识别,如游戏框架unity,Cocos-js以及网易内部的游戏框架同时也支持原生Android App 的基于元素识别的UI自动化测试.本文主要使用目 ...