早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(Spring MVC+MyBatis)在启动过程中多次解析mybatis的xml配置文件及初始化数据,对开发阶段开发人员反复启停项目造成很大的时间浪费,也即是下面的第一种方式。

1.Servlet方式


  1. @Component

  2. public class InitDataServlet extends HttpServlet {

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

  4.    static AbstractApplicationContext ctx;

  5.    static {

  6.        ctx = new FileSystemXmlApplicationContext("classpath:conf/spring*.xml");

  7.    }

  8.    /**

  9.     * serialVersionUID:

  10.     *

  11.     * @since JDK 1.6

  12.     */

  13.    private static final long serialVersionUID = 1L;

  14.    /**

  15.     * 初始化数据

  16.     *

  17.     * @see javax.servlet.GenericServlet#init()

  18.     */

  19.    public void init() throws ServletException {

  20.        loadBaseData();

  21.    }

  22. }

这种方式应该是比较常见的,上述代码之所以这么写,是因为Servlet中无法使用使用Spring容器的上下文,只能在servlet中重新获取,这也就导致了两次容器的加载,与之相对应就是两次相关程序的调用。

以上代码,并结合web.xml中配置load-on-startup值为0,可以在项目启动后立即执行InitDataServlet方法。

后期优化成InitializingBean的方式重构,启动速度上更快一步。下面简单介绍下两种方式

2.InitializingBean方式


  1. @Component

  2. public class InitDataServlet implements InitializingBean {

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

  4.  @Override

  5.  public void afterPropertiesSet() throws Exception {

  6.    loadBaseData();

  7.  }

  8. }

application.xml配置文件


  1. <!-- 配置使其可扫描到InitDataServlet-->

  2. <context:component-scan base-package="com.pkg.servlet"/>

  3. <!-- 也可以在xml中配置bean,可以指定属性init-method。-->

3.ApplicationListener方式


  1. @Component

  2. public class InitDataServlet implements ApplicationListener<ContextRefreshedEvent> {

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

  4.  @Override

  5.  public void onApplicationEvent(ContextRefreshedEvent event) {

  6.        //第一种方式

  7.        //if (event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext")) {

  8.            //TODO 编写自己的初始化数据方法

  9.        //}

  10.        //第二种

  11.        if(event.getApplicationContext().getParent() == null){

  12.            //TODO 编写自己初始化数据的方法

  13.        }

  14.  }

  15. }

方法体内有一个if分支只是为了规避onApplicationEvent方法执行多次,在Spring MVC的项目中,系统会存在两个容器,一个是Root WebApplicationContext ,另一个就是我们自己的WebApplicationContext(作为Root WebApplicationContext的子容器),若不加以判断,会给系统造成不必要的负载或逻辑上的错误等等。

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

扩展阅读:

【Spring容器】项目启动后初始化数据的两种实践方案的更多相关文章

  1. spring boot项目获取application配置文件参数的两种方式

    前言:了解过spring boot这个技术的,应该知道spring boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件**.properties的信息 ...

  2. springboot 学习之路 9 (项目启动后就执行特定方法)

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

  3. spring boot 项目启动无任何反应

    遇到的问题 spring boot项目启动后无任何报错,ps有进程,nohub无日志 定位 更换jar包,问题依然存在,将jar包放到其他服务器,运行正常,排除打包问题 同服务器其他系统运行正常,但停 ...

  4. Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)

    最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...

  5. Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源

    Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源 在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spri ...

  6. SpringBoot 源码解析 (三)----- Spring Boot 精髓:启动时初始化数据

    在我们用 springboot 搭建项目的时候,有时候会碰到在项目启动时初始化一些操作的需求 ,针对这种需求 spring boot为我们提供了以下几种方案供我们选择: ApplicationRunn ...

  7. 让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean

    让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean 问题描述 实现思路 思路一 [不符合要求] 思路二[满足要求] 思路三[未试验] 问题描述 目前我工作环境下,后端主要的框架 ...

  8. spring项目启动后,获取bean的方法总结

    如果在web项目中,用到定时器的朋友可能会遇到使用spring注解的方式获取bean的时候报空指针的异常.这是就可以使用手工的方法获取spring容器中的bean了. 下面是具体的方法: 1.先说一个 ...

  9. web容器启动后自动执行程序的几种方式比较

    1.       背景 1.1.       背景介绍 在web项目中我们有时会遇到这种需求,在web项目启动后需要开启线程去完成一些重要的工作,例如:往数据库中初始化一些数据,开启线程,初始化消息队 ...

随机推荐

  1. 零元学Expression Blend 4 - Chapter 16 用实例了解互动控制项「Button」II

    原文:零元学Expression Blend 4 - Chapter 16 用实例了解互动控制项「Button」II 本章将教大家如何制作自己的Button,并以玻璃质感Button为实作案例. ? ...

  2. 用TTcpClient和TTcpServer进行文件的传输

    发送数据时有Sendln,SendBuf,SendStream.接收数据时有Receiveln,ReceiveBuf,当时我很奇怪为什么没有ReceiveStream.因为很自然的想到是对应关系的.但 ...

  3. jQuery.form的使用方法

    首先需要引入jquery.form.js 之后即可使用 jquery.form.js的中文API网址http://www.vaikan.com/docs/jquery.form.plugin/jque ...

  4. Qt在Windows下的三种编程环境搭建(图文并茂,非常清楚)good

    尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得知其支持的平台.编译器 ...

  5. T4随记

    关于T4模板的信息我就不赘述了,百度一大堆 MSDN的介绍 https://msdn.microsoft.com/zh-cn/library/bb126478.aspx 下面是简单的一个示例,从类中获 ...

  6. 解释一下,知乎上关于C语言奇技淫巧最火的回答。

    前几天逛知乎,碰巧发现一个很火的问题. “C 语言有什么奇技淫巧?”虽然问题本身没有什么特殊的地方,但是网友的回答却是非常幽默. 下面就让我们一起来分析一下,被赞最多的答案“C 语言运算符 趋向于‘- ...

  7. 深入理解Java G1垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

  8. vs2010添加TSTCON( ActiveX Control Test Container )工具

    vs2010中的TSTCON( ActiveX Control Test Container )工具非自动安装,而是作为一个例程提供.所以应找到该例程,并编译: 如vs2010安装在默认路径则 1, ...

  9. mac 下重启 MYSQL 命令

    在mac 下重启mysql的命令如下: 启动MySQL服务 sudo /usr/local/MySQL/support-files/mysql.server start   停止MySQL服务 sud ...

  10. 怎么用Hostwinds搭建Wordpress博客网站(超详细图文教程)

    Hostwinds 成立于 2010 年,在主机托管行业算是一个比较新的品牌,但是,凭借丰富的产品线.卓越的服务器性能.良好的客户支持,以及低廉实惠的价格,他们受到了广大客户的喜爱,并多次获得行业重要 ...