`

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

相关推荐

Global site tag (gtag.js) - Google Analytics