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. LeetCode: Search Insert Position 解题报告

    Search Insert Position Given a sorted array and a target value, return the index if the target is fo ...

  2. 【TensorFlow】CNN

    tf.nn.conv2d 这个函数的功能是:给定4维的input和filter,计算出一个2维的卷积结果.函数的定义为: def conv2d(input, filter, strides, padd ...

  3. Mysql 多表查询详解

    Reference:  https://blog.csdn.net/jintao_ma/article/details/51260458 一.前言 二.示例 三.注意事项 一.前言 上篇讲到Mysql ...

  4. virtual box 5.2.12 扩展包安装

    http://download.virtualbox.org/virtualbox/     找到对应版本的virulbox去下载就可以了

  5. 4. K-Means和K-Means++实现

    1. K-Means原理解析 2. K-Means的优化 3. sklearn的K-Means的使用 4. K-Means和K-Means++实现 1. 前言 前面3篇K-Means的博文从原理.优化 ...

  6. Mysql注入绕过姿势

    1.内联绕过 2.编码绕过,如URLEncode编码,ASCII,HEX,unicode编码绕过 or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(9 ...

  7. nginx报502 bad GateWay错误的解决方法

    nginx+php-fpm+mysql的网站,访问nginx的某个页面,报502 GateWay的错误,一般见到此错误,可以判断是php-fpm的问题,而不是nginx的问题.通过监控nginx的错误 ...

  8. [转]python进行中文文本聚类(切词以及Kmeans聚类)

    简介 查看百度搜索中文文本聚类我失望的发现,网上竟然没有一个完整的关于Python实现的中文文本聚类(乃至搜索关键词python 中文文本聚类也是如此),网上大部分是关于文本聚类的Kmeans聚类的原 ...

  9. python MQTT 出现TypeError: payload must be a string, bytearray, int, float or None.

    原因, MQTT 发布信息,是不能发布 对象的,只能发布 字符串,整形,浮点型这样的 解决方法 self.__mqtt__.publish("computex/iot/5100/DataTr ...

  10. Postgres数据库补丁脚本示例

    SET client_encoding = 'UTF8';-- 新建序列和表DROP TABLE IF EXISTS cms_user_unit;DROP SEQUENCE IF EXISTS cms ...