在做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. SQL Server操作实例

    创建数据库 create database accountInfo/*创建账户信息数据库*/ 创建数据表 /*定义主码.外码.和人数.余额的取值范围.*/ /*创建储蓄所表*/ create tabl ...

  2. 一步一步学习IdentityServer4 (2) 开始一个简单的事例

    前面将来一些配置,但是很多都不是必要的,先放一些事例需要的简要配置把 既然是IdentityServer4 所里下面的例子我 直接放到 Linux上 测试环境 CentOS 7 +Nginx1.9.3 ...

  3. ASP.NET:MVC模板化机制

    模版化的核心是定制ViewEngine.完整的模板化必须实现3个功能:1.网站的多套模版(razor)支持 2.模版的多样式(style)支持. 3.按需实现模版:没有实现的加载默认模版. 我们除了要 ...

  4. jquery validate不用submit提交,用js提交的

    jquery validate控件 默认是使用submit提交的, 要想改成使用button的click事件处理函数中手工提交, 可以按照如下方式操作: 1 绑定form的validate, 2 然后 ...

  5. 【LOJ】#2289. 「THUWC 2017」在美妙的数学王国中畅游

    题解 我们发现,题目告诉我们这个东西就是一个lct 首先,如果只有3,问题就非常简单了,我们算出所有a的总和,所有b的总和就好了 要是1和2也是多项式就好了--其实可以!也就是下面泰勒展开的用处,我们 ...

  6. MyEclipse个性化设置

    1.修改项目文件默认编码 Note:myEclipse默认的编码是GBK, 也就是未设置编码格式的文件都默认使用GBK进行编码, 而更糟糕的是JSP.JavaScriptt默认编码竟然是ISO-885 ...

  7. Python全栈开发之17、tornado和web基础知识

    一.web基础知识 学习web框架之前,先来看一下web基础知识,首先要明白其本质就是socket,用户对应一个socket客户端,但是如果从socket开始开发web应用程序那么效率太了,正确的做法 ...

  8. phpstorm 输入法中文不同步 phpstorm 输入法不跟随光标解决办法

    win7系统新安装的phpstorm2017.2版本,试了很多输入法,要么是不显示候选次,要么是输入法候选词总是在屏幕右下角,没有跟随光标移动.百度很久,重要找到解决方案. 就是替换phpstorm安 ...

  9. myql root用户远程访问

    虚拟机搭建的lnmp开发环境,mysql在虚拟机正常访问,想在物理机通过数据库管理工具Navicat远程登录,方便建表查询等操作.经网上一查,有答案了. [以下是转载]http://www.cnblo ...

  10. VPS开启Google BBR

    前言:系统环境为Ubuntu 18.04 修改系统变量: echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf ec ...