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個小時的等待時間,提高開發的效率是很有必要的。