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个小时的等待时间,提高开发的效率是很有必要的。

  • 相关阅读:
    正经学C#_循环[do while,while,for]:[c#入门经典]
    Vs 控件错位 右侧资源管理器文件夹点击也不管用,显示异常
    asp.net core 获取当前请求的url
    在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be
    用orchard core和asp.net core 3.0 快速搭建博客,解决iis 部署https无法登录后台问题
    System.Data.Entity.Core.EntityCommandExecution The data reader is incompatible with the specified
    初探Java设计模式3:行为型模式(策略,观察者等)
    MySQL教程77-CROSS JOIN 交叉连接
    MySQL教程76-HAVING 过滤分组
    MySQL教程75-使用GROUP BY分组查询
  • 原文地址:https://www.cnblogs.com/kunpengit/p/4001654.html
Copyright © 2011-2022 走看看