前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Spring容器】项目启动后初始化数据的两种实践方案

【Spring容器】项目启动后初始化数据的两种实践方案

作者头像
MavenTalker
发布2023-03-07 10:22:22
3160
发布2023-03-07 10:22:22
举报
文章被收录于专栏:歪脖贰点零
早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(Spring MVC+MyBatis)在启动过程中多次解析mybatis的xml配置文件及初始化数据,对开发阶段开发人员反复启停项目造成很大的时间浪费,也即是下面的第一种方式。

1.Servlet方式

代码语言:javascript
复制
@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方式

代码语言:javascript
复制
@Component
public class InitDataServlet implements InitializingBean {

  private static final Logger LOGGER = Logger.getLogger(InitDataServlet.class);

  @Override
  public void afterPropertiesSet() throws Exception {

    loadBaseData();

  }

}

application.xml配置文件

代码语言:javascript
复制
<!-- 配置使其可扫描到InitDataServlet-->
<context:component-scan base-package="com.pkg.servlet"/>
<!-- 也可以在xml中配置bean,可以指定属性init-method。-->

3.ApplicationListener方式

代码语言:javascript
复制
@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的子容器),若不加以判断,会给系统造成不必要的负载或逻辑上的错误等等。

如果你还在使用第一种方式的话,建议重构为后两种方式。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MavenTalk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Servlet方式
  • 2.InitializingBean方式
  • 3.ApplicationListener方式
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档