在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听、Servlet加载初始化等切入点为数据库准备数据,这些初始化数据 是系统开始运行前必须的数据,例如权限组、系统选项、默认管理员等等。但是项目若不是WEB工程,或者说还没用到WEB层(例如单元测试),这时应如何方 便地初始化数据呢?

借助Spring容器是个很好的解决方案。Spring框架提供了事件机制,而事件机制必须实现ApplicationListener监听器,因此我们 只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中检测数据库的初始化数据是否存在并选择初始化之。

第一步:定义一个类InitData实现ApplicationListener

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import org.apache.commons.logging.Log;
  4. import org.apache.commons.logging.LogFactory;
  5. import org.springframework.context.ApplicationEvent;
  6. import org.springframework.context.ApplicationListener;
  7. import org.springframework.stereotype.Controller;
  8. import com.ebay.cloud.cms.typsafe.metadata.model.MetaClass;
  9. import com.ebay.tools.cms.exception.UtilityException;
  10. import com.ebay.tools.cms.util.CommonInterfaceUtility;
  11. import com.ebay.tools.cms.util.ExceptionUtils;
  12. import com.ebay.tools.cms.util.LoggerUtil;
  13. /**
  14. * @author Josh Wang(Sheng)
  15. * @email swang6@email.com
  16. *
  17. * This class used to initialize data / load data ON the application started
  18. */
  19. @Controller
  20. public class InitData implements ApplicationListener<ApplicationEvent> {
  21. private Log logger = LogFactory.getLog(InitData.class);
  22. private static boolean isStart = false;
  23. private static Map<String, MetaClass> cmsMetas = new HashMap<String, MetaClass>();
  24. public void onApplicationEvent(ApplicationEvent event) {
  25. if (!isStart) {
  26. isStart = true;
  27. LoggerUtil.info(logger, "Start to load CMS Meta data");
  28. try {
  29. cmsMetas = CommonInterfaceUtility.getMetaClass();
  30. } catch (UtilityException e) {
  31. LoggerUtil.error(logger, "Load Meta Class failed" + ExceptionUtils.getStackTraceMsg(e));
  32. }
  33. LoggerUtil.info(logger,"End to load CMS Meta data");
  34. LoggerUtil.info(logger,"Start to load Other data");
  35. LoggerUtil.info(logger,"End to load Other data");
  36. }
  37. }

 第二步:解决onApplicationEvent(方法被执行两次以上的问题:

原因:

在web 项目中(spring mvc),系统会存在两个容器,一个是root application context ,另一个就是我们自己的 projectName-servlet  context(作为root application context的子容器)。 这种情况下,就会造成onApplicationEvent方法被执行两次。

解决方法:

如代码所示,只需要使用一个类变量isStart即可。

需要注意的是,一定要加Annotation @Controller,这样才表示是一个Spring的Bean(否则在相关Spring的xml中配置),才能被Spring容器处理。

第三步,写一个Spring JunitTest,注意相关的Annotation

需要注意的就是在类上面加入如下两个Annotation即可:

@ContextConfiguration(locations = "file:../validator-web/src/main/webapp/WEB-INF/cms-validator-servlet.xml")

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration用于加载spring的核心配置文件,因为这个操作是一个公共的操作,所以我们常常可以写在一个BaseTest中。

  1. @ContextConfiguration(locations = "file:../validator-web/src/main/webapp/WEB-INF/cms-validator-servlet.xml")
  2. public class BaseTest {
  3. /**
  4. * Set up the environment
  5. * @throws Exception
  6. */
  7. @BeforeClass
  8. public static void setUp() throws Exception {
  9. }
  10. public static void print(String message) {
  11. System.out.println(message);
  12. }
  13. public static void printHighlight(String message) {
  14. System.err.println(message);
  15. }
  16. }

然后只需要在你的测试类上用这个Annotation:@RunWith(SpringJUnit4ClassRunner.class)

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. public class TestCacheUtil extends BaseTest {
  3. @Test
  4. public void getCMSMetaAttributeType() throws UtilityException {
  5. }
  6. }

Spring初始化完成后直接执行一个方法,初始化数据(解决方法被重复执行两次的情况)的更多相关文章

  1. ubuntu16 升级后找不到 eth0 网卡 的解决方法

    ubuntu16 升级后找不到 eth0 网卡 的解决方法 今天在VPS上一时手痒,执行了升级命令 apt-get update 更新软件包索引,源 apt-get upgrade 更新软件包 apt ...

  2. IIS发布网站浏览之后看到的是文件目录 & Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法 & App_global.asax.pduxejp_.dll”--“拒绝访问。 ”

    Q:IIS发布网站浏览之后看到的是文件目录 A:它出现了一个说到.NET4.0 更高框架什么的错误,所以我将 .NTE CRL版本由4.0改为2.0了,改为2.0后就出现了只能浏览文件目录了.改为4. ...

  3. [代码]--IIS发布网站浏览之后看到的是文件目录 & Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法 & App_global.asax.pduxejp_.dll”--“拒绝访问。 ”

    Q:IIS发布网站浏览之后看到的是文件目录 A:它出现了一个说到.NET4.0 更高框架什么的错误,所以我将 .NTE CRL版本由4.0改为2.0了,改为2.0后就出现了只能浏览文件目录了.改为4. ...

  4. Asp.Net 应用程序在IIS发布后无法连接oracle数据库问题的解决方法

    asp.net程序编写完成后,发布到IIS,经常出现的一个问题是连接不上Oracle数据库,具体表现为Oracle的本地NET服务配置成功:用 pl/sql 等工具也可以连接上数据库,但是通过浏览器中 ...

  5. mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法!

    mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法! 修改mysql5.7的配置文件即可解决,方法如下: linux版:找到mysql的安装路径进入默认的为/usr/shar ...

  6. SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

    原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...

  7. 安装visual studio2017后 首次启动出现ActivityLog.xml异常解决方法

    安装visual studio2017后 首次启动出现ActivityLog.xml异常解决方法 ps:操作系统是win10 在官网下载了vs2017社区版按照教程(教程链接在文末)安装完成之后,首次 ...

  8. MATLAB实例:聚类初始化方法与数据归一化方法

    MATLAB实例:聚类初始化方法与数据归一化方法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 聚类初始化方法:init_methods.m f ...

  9. impala 四舍五入后转换成string后又变成一个double的数值解决(除不尽的情况)

    impala 四舍五入后转换成string后又变成一个double的数值解决(除不尽的情况)例如Query: select cast(round(2 / 3, 4)*100 as string)+-- ...

  10. Android 非Activity类引用getResources()方法问题的解决方法

    在进行Android开发的过程中,在一个非Activity类(此处假设类名为MyNewClass)中引用了getResources()方法,如下: Bitmap bmp = BitmapFactory ...

随机推荐

  1. 一步一步学习IdentityServer3 (5)

    这篇文章介绍下数据持久化问题,官方例子可能都是缓存数据 Client  User Scope 下面介绍下怎么使用数据库持久化 这里需要导入nuget包 :IdentityServer3.EntityF ...

  2. Monaco Editor 使用入门

    以前项目是用ace编辑器的,但是总有些不敬人意的地方.前端事件看见的VS Code编辑器Monaco Editor准备更换下,下面介绍一些使用中遇到的一点问题.代码提示 1.项目引用 import * ...

  3. Spark(十六)DataSet

    Spark最吸引开发者的就是简单易用.跨语言(Scala, Java, Python, and R)的API. 本文主要讲解Apache Spark 2.0中RDD,DataFrame和Dataset ...

  4. Hadoop错误1(Text类型与String类型)

    在此类的博客中,博主主要记录的是在Hadoop实践过程中遇到的一些错误,先上一个代码 protected void map(Object key,Text value, Context context ...

  5. Maven项目使用阿里云的Maven库

    Maven项目下载一些jar包非常慢,有时候一个项目能下一个上午,因此可以考虑使用阿里云的Maven库,因为是国内的,所以下载速度非常酷 单个项目使用阿里云的Maven库: pom文件中 <!- ...

  6. 俄罗斯方块 Tetris

    今天,为大家带来一个用Qt C++ (Windows环境下)做的一个简易俄罗斯方块小游戏 思路和模块介绍都在注释里面,其次就是一些项目中遇到的问题以及解决方案,在后面部分说明. 一.效果 测试图样 Q ...

  7. Android 中的广播(Broadcast)

    Android 广播(broadcast) 饮水思源 本文章内容学习和总结自 郭霖大神:<Android第一行代码> Overview 就像我们的学校里的喇叭一样,是用来通知的.而Andr ...

  8. [leetcode tree]102. Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  9. pycharm安装使用,python运算规则

    首先讲了pycharm的安装和使用,基本上算是个脚本编辑器.另外pycharm的一些操作方法:http://edu.51cto.com/course/9043.html 葫芦老师录的pycharm视频 ...

  10. CentOS7.4 关闭firewall防火墙,改用iptables

    1.关闭默认的firewall防火墙 systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service ...