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

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

作者: MavenTalk | 来源:发表于2018-01-17 06:51 被阅读222次

早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(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配置文件

3.ApplicationListener方式

@Component

public class InitDataServlet implements ApplicationListener {

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

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

扩展阅读:

一个5年码龄人的『2017个人总结与展望』

一个程序员的2017年书单整理

Elasticsearch实战总结

基于SpringCloud的Microservices架构实战案例-序篇

相关文章

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

    早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(Spring MVC+MyBati...

  • dubbo服务启动过程

    在项目启动过程中,dubbo服务如何随项目的启动而发布?dubbo如何随着spring容器的初始化而启动。 已知,...

  • springboot初始化数据

    初始化数据 初始化数据分为jpa和JDBC两种方式。 场景:个人博客项目,启动项目后,数据库user表自动创建用户...

  • spring容器IOC启动流程

    spring容器IOC初始化流程 启动核心类:AbstractApplicationContext启动方法:ref...

  • 2018-06-07

    如何在项目启动时执行某些操作 项目启动时,利用spring容器初始化bean来实现。 共3种方法: (1)通过@P...

  • Spring Boot启动过程

    对于Spring Boot项目来说只需要如下代码就可以启动整个项目 那么Spring容器,Web容器等等是怎么启动...

  • Spring: 初始化过程

    Spring IoC容器的初始化是由AbstractApplicationContext的refresh()来启动的。

  • spring 项目启动后, 执行资源初始化任务

    spring 项目启动后, 我们往往有一些需要初始化的资源,比如: redis 存储的字典数据更新等这时候, 可以...

  • Spring mvc容器启动

    Spring web容器 Spring MVC项目启动时会有两个ApplicationContext容器,Root...

  • spring-容器1-概览

    spring-容器2-初始化1spring-容器3-初始化2spring-容器4-初始化完成spring-容器5-...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/jslyoxtx.html