springMVC工程使用jreloader实现热部署

it2025-10-08  3

springMVC工程使用jreloader实现热部署applicationContext - ContextLoaderListener重新加载DispatcherServlet 重新加载提高开发效率

 

1: jreloader 是class的热加载器(1) 从网上下载jreloaderjar包(2) 在运行配置中的vm参数中添加-noverify -javaagent:./jreloader.jar - Djreloader.dirs=./target/classesDjreloader.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);}@Overridepublic 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");@Overridepublic 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:添加重载的Controllerimport 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个小时的等待时间,提高开发的效率是很有必要的。

转载于:https://www.cnblogs.com/kunpengit/p/4001654.html

相关资源:各显卡算力对照表!
最新回复(0)