【Spring容器】项目启动后初始化数据的两种实践方案
早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(Spring MVC+MyBatis)在启动过程中多次解析mybatis的xml配置文件及初始化数据,对开发阶段开发人员反复启停项目造成很大的时间浪费,也即是下面的第一种方式。
1.Servlet方式
@Component
public class InitDataServlet extends HttpServlet {
private static final Logger LOGGER = Logger.getLogger(InitDataServlet.class);
static AbstractApplicationContext ctx;
static {
ctx = new FileSystemXmlApplicationContext("classpath:conf/spring*.xml");
}
/**
* serialVersionUID:
*
* @since JDK 1.6
*/
private static final long serialVersionUID = 1L;
/**
* 初始化数据
*
* @see javax.servlet.GenericServlet#init()
*/
public void init() throws ServletException {
loadBaseData();
}
}
这种方式应该是比较常见的,上述代码之所以这么写,是因为Servlet中无法使用使用Spring容器的上下文,只能在servlet中重新获取,这也就导致了两次容器的加载,与之相对应就是两次相关程序的调用。
以上代码,并结合web.xml中配置load-on-startup值为0,可以在项目启动后立即执行InitDataServlet方法。
后期优化成InitializingBean的方式重构,启动速度上更快一步。下面简单介绍下两种方式
2.InitializingBean方式
@Component
public class InitDataServlet implements InitializingBean {
private static final Logger LOGGER = Logger.getLogger(InitDataServlet.class);
@Override
public void afterPropertiesSet() throws Exception {
loadBaseData();
}
}
application.xml配置文件
<!-- 配置使其可扫描到InitDataServlet-->
<context:component-scan base-package="com.pkg.servlet"/>
<!-- 也可以在xml中配置bean,可以指定属性init-method。-->
3.ApplicationListener方式
@Component
public class InitDataServlet implements ApplicationListener<ContextRefreshedEvent> {
private static final Logger LOGGER = Logger.getLogger(InitDataServlet.class);
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//第一种方式
//if (event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext")) {
//TODO 编写自己的初始化数据方法
//}
//第二种
if(event.getApplicationContext().getParent() == null){
//TODO 编写自己初始化数据的方法
}
}
}
方法体内有一个if分支只是为了规避onApplicationEvent方法执行多次,在Spring MVC的项目中,系统会存在两个容器,一个是Root WebApplicationContext ,另一个就是我们自己的WebApplicationContext(作为Root WebApplicationContext的子容器),若不加以判断,会给系统造成不必要的负载或逻辑上的错误等等。
如果你还在使用第一种方式的话,建议重构为后两种方式。
扩展阅读:
成长的乐趣,在于分享!
|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架