spring 初始化之后执行的方法
2015-10-10 18:11
573 查看
Spring初始化完成后直接执行一个方法,初始化数据(解决方法并执行两次)
在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听、Servlet加载初始化等切入点为数据库准备数据,这些初始化数据 是系统开始运行前必须的数据,例如权限组、系统选项、默认管理员等等。但是项目若不是WEB工程,或者说还没用到WEB层(例如单元测试),这时应如何方 便地初始化数据呢?
借助Spring容器是个很好的解决方案。Spring框架提供了事件机制,而事件机制必须实现ApplicationListener监听器,因此我们 只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中检测数据库的初始化数据是否存在并选择初始化之。
第一步:定义一个类InitData实现ApplicationListener
第二步:解决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中。
然后只需要在你的测试类上用这个Annotation:@RunWith(SpringJUnit4ClassRunner.class)
在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听、Servlet加载初始化等切入点为数据库准备数据,这些初始化数据 是系统开始运行前必须的数据,例如权限组、系统选项、默认管理员等等。但是项目若不是WEB工程,或者说还没用到WEB层(例如单元测试),这时应如何方 便地初始化数据呢?
借助Spring容器是个很好的解决方案。Spring框架提供了事件机制,而事件机制必须实现ApplicationListener监听器,因此我们 只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中检测数据库的初始化数据是否存在并选择初始化之。
第一步:定义一个类InitData实现ApplicationListener
import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Controller; import com.ebay.cloud.cms.typsafe.metadata.model.MetaClass; import com.ebay.tools.cms.exception.UtilityException; import com.ebay.tools.cms.util.CommonInterfaceUtility; import com.ebay.tools.cms.util.ExceptionUtils; import com.ebay.tools.cms.util.LoggerUtil; /** * @author Josh Wang(Sheng) * @email swang6@email.com * * This class used to initialize data / load data ON the application started */ @Controller public class InitData implements ApplicationListener<ApplicationEvent> { private Log logger = LogFactory.getLog(InitData.class); private static boolean isStart = false; private static Map<String, MetaClass> cmsMetas = new HashMap<String, MetaClass>(); public void onApplicationEvent(ApplicationEvent event) { if (!isStart) { isStart = true; LoggerUtil.info(logger, "Start to load CMS Meta data"); try { cmsMetas = CommonInterfaceUtility.getMetaClass(); } catch (UtilityException e) { LoggerUtil.error(logger, "Load Meta Class failed" + ExceptionUtils.getStackTraceMsg(e)); } LoggerUtil.info(logger,"End to load CMS Meta data"); LoggerUtil.info(logger,"Start to load Other data"); LoggerUtil.info(logger,"End to load Other data"); } }
第二步:解决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中。
@ContextConfiguration(locations = "file:../validator-web/src/main/webapp/WEB-INF/cms-validator-servlet.xml") public class BaseTest { /** * Set up the environment * @throws Exception */ @BeforeClass public static void setUp() throws Exception { } public static void print(String message) { System.out.println(message); } public static void printHighlight(String message) { System.err.println(message); } }
然后只需要在你的测试类上用这个Annotation:@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringJUnit4ClassRunner.class) public class TestCacheUtil extends BaseTest { @Test public void getCMSMetaAttributeType() throws UtilityException { } }
相关文章推荐
- java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
- Java中ZIP与Gzip的压缩与解压处理,其中有Base64处理
- java学习日记----------------------封装的日期类MyDate
- java核心技术之reflect(一):一个系统学习reflect的Demo(精)
- Java语音SDK接口开发经验及具体开发实现
- Servlet与一般Java类的区别是什么?
- java 代理模式
- JAVA操作Excel文件 JXL
- java ReentrantLock可重入锁功能
- 基础学习--调试/intellij快捷键
- 在 Java 应用程序中访问 USB 设备
- 使用Java对数据库进行基本的查询和更新操作
- java基础
- 虚拟机操作---JDK与Hadoop的安装
- java如何获取当前时间的方法汇总
- java二叉树 TreeMap集合测试
- 用java来写一个猜数字游戏,要用到界面
- java代码获知该方法被哪个类、哪个方法、在哪一行调用
- Java编程思想(一) —— 一切都是对象及内存分配
- [JAVA]定时任务之-Quartz使用篇