zoukankan      html  css  js  c++  java
  • 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个小时的等待时间,提高开发的效率是很有必要的。

  • 相关阅读:
    操作系统路径.islink在使用python的windows上
    Python shutil模块zz
    CMake 两种变量原理 ZZ
    cmake语法-函数和宏的定义
    cmake函数、宏和模块
    cmake函数、宏和模块
    CMake 常用宏分享
    设定cmake输出目录
    android layerlist 里面的rotate标签得到三角形原理详解
    abp(net core)+easyui+efcore实现仓储管理系统——出库管理之三(五十一)
  • 原文地址:https://www.cnblogs.com/kunpengit/p/4001654.html
Copyright © 2011-2022 走看看