项目需求是在启动服务时,将某些内容放入到共同里面,例如数据字典表内容。

但数据字典表内容存在于数据库中,使用传统的listener在加载时,无法获取service实例,打开事务控制。

springmvc提供了几个接口,可以在启动时执行。

InitializingBean和ServletContextAware都可以添加。

因加载的内容大多都是全局共用,因此可用servletContext来存储,在使用的地方获取即可。

如果使用单例模式存储对象,可使用InitializingBean,将数据放入到单例对象中。

  1. /**
  2. * 系统初始化完毕后则会执行此方法
  3. * @Description:
  4. * @author DennyZhao
  5. * @date 2018年3月6日
  6. * @version 1.0
  7. */
  8. public class InitDataListener implements InitializingBean,ServletContextAware {
  9.  
  10. /**
  11. * 单位名称服务类
  12. */
  13. @Inject
  14. private UnitService unitService;
  15.  
  16. /**
  17. * 列表服务类
  18. */
  19. @Inject
  20. private ItemsService itemsService;
  21.  
  22. /**
  23. * 根据单位服务类获取单位名称
  24. */
  25. @Override
  26. public void afterPropertiesSet() throws Exception {
  27. SingleItems singleItem = SingleItems.getInstance();
  28. // 获取所有的单位名称
  29. List<UnitDO> unitAllList = unitService.getUnitAllList();
  30. List<String> unitNameList = new ArrayList<String>();
  31. unitAllList.forEach(unitDO -> {
  32. unitNameList.add(unitDO.getUnitName());
  33. });
  34. singleItem.setUnitNameList(unitNameList);
  35. // 获取所有的列表
  36. Map<String, List<String>> allItemsMap = itemsService.getAllItemsMap();
  37. singleItem.setItemMap(allItemsMap);
  38. }
  39.  
  40. @Override
  41. public void setServletContext(ServletContext servletContext) {
  42. }
  43.  
  44. }

单例对象见Java下的单例模式:

创建模式--单例模式Singleton(JAVA)

  1. package com.pccw.solutions.retire.common.model;
  2.  
  3. import java.io.Serializable;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8.  
  9. import javax.inject.Singleton;
  10.  
  11. import org.apache.commons.collections.MapUtils;
  12.  
  13. /**
  14. * 创建单例模式对象,全局共用一个对象,将所有的查询Item结果放入到此对象中
  15. * @Description:
  16. * @author DennyZhao
  17. * @date 2018年3月6日
  18. * @version 1.0
  19. */
  20. @Singleton
  21. public class SingleItems implements Serializable{
  22.  
  23. /**
  24. * 自动生成序列号
  25. */
  26. private static final long serialVersionUID = -3893810440799071288L;
  27.  
  28. /**
  29. * 实例对象
  30. */
  31. private static final SingleItems SINGLE_ITEMS = new SingleItems();
  32.  
  33. /**
  34. * 单位名称列表
  35. */
  36. private List<String> unitNameList = new ArrayList<String>();
  37.  
  38. /**
  39. * Item全局对象
  40. */
  41. private Map<String, List<String>> itemMap = new HashMap<String, List<String>>();
  42.  
  43. private SingleItems() {
  44. }
  45.  
  46. /**
  47. * set ItemMap
  48. * @param itemMap
  49. */
  50. public void setItemMap(Map<String, List<String>> itemMap) {
  51. synchronized (this.itemMap){
  52. if(this.itemMap != null && !MapUtils.isEmpty(this.itemMap)) {
  53. return;
  54. }
  55. this.itemMap = itemMap;
  56. }
  57. }
  58.  
  59. /**
  60. * 获取单例对象
  61. * @return
  62. */
  63. public static SingleItems getInstance() {
  64. return SINGLE_ITEMS;
  65. }
  66.  
  67. /**
  68. * 单位名称检查
  69. * @param unitName
  70. * @return
  71. */
  72. public boolean checkUnitName(String unitName) {
  73. return unitNameList.contains(unitName);
  74. }
  75.  
  76. /**
  77. * 添加内容
  78. * @param itemType
  79. * @param itemList
  80. */
  81. public void addItem(String itemType, List<String> itemList) {
  82. synchronized (itemMap){
  83. // 判断是否已经存在
  84. if(itemMap.containsKey(itemType)) {
  85. return;
  86. }
  87. // 添加
  88. itemMap.put(itemType, itemList);
  89. }
  90. }
  91.  
  92. /**
  93. * 根据项类型,和项名称判断是否存在此名称
  94. * @param itemType
  95. * @param itemName
  96. * @return
  97. */
  98. public boolean checkItem(String itemType, String itemName) {
  99. List<String> itemList = itemMap.get(itemType);
  100. if(itemList == null || itemList.size() == 0) {
  101. return false;
  102. }
  103. return itemList.contains(itemName);
  104. }
  105.  
  106. /**
  107. * 获取Item列表
  108. */
  109. public List<String> getItem(String itemType){
  110. List<String> itemList = itemMap.get(itemType);
  111. return itemList;
  112. }
  113.  
  114. /**
  115. * 移除内容
  116. */
  117. public void removeItem(String itemType) {
  118. synchronized (this.itemMap){
  119. // 判断是否已经存在
  120. if(!itemMap.containsKey(itemType)) {
  121. return;
  122. }
  123. // 移除内容
  124. itemMap.remove(itemType);
  125. }
  126. }
  127.  
  128. /**
  129. * @param unitNameList the unitNameList to set
  130. */
  131. public void setUnitNameList(List<String> unitNameList) {
  132. synchronized (this.unitNameList){
  133. if(this.unitNameList != null && this.unitNameList.size() > 0) {
  134. return;
  135. }
  136. this.unitNameList = unitNameList;
  137. }
  138. }
  139. }

然后在dispatcher-servlet.xml中加入bean,或者在spring-bean.xml中,注意bean的位置要放在service注解被装载到spring容器中,且事务控制之后。

  1. <!-- 初始化操作 -->
  2. <bean id="initDataListener" class="com.*.common.listener.InitDataListener"></bean>

springmvc initial初始化的更多相关文章

  1. springmvc的初始化参数绑定

    一.springmvc的初始化参数绑定 此种和我们之前说的类型转换非常相似,可以看作是一种类型转换 在初始化参数绑定时  重要的是参数类型 -------------------单日期的绑定 二. 配 ...

  2. SpringMvc中初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  3. SpringMVC DispatcherServlet初始化过程

    先来上一张类的结构图: 图里仅仅画了跟初始化相关的方法. 首先DispatcherServlet也是一个Servlet,初始化从init()方法開始. 以下就详细看看ini()是怎么实现的吧. 1.S ...

  4. Spring MVC(一)--SpringMVC的初始化和流程

    SpringMVC是Spring提供给WEB应用的MVC框架,MVC框架一般来说由三部分组成: Model:模型层,一般由java bean完成,主要是进行数据库操作: View:视图层,用于前端展示 ...

  5. 当springMVC 容器初始化完成后执行某个方法

    分类: spring java2013-06-19 16:40 8289人阅读 评论(4) 收藏 举报 在某些应用中,我们希望,当spring 容器将所有的bean都初始化完成后,做一个操作(例如:将 ...

  6. SpringMVC 的初始化参数绑定

    初始化参数绑定:日期格式 一:首先我们先做一种日期格式的绑定,配置初始化参数绑定和自定义类型转换有着异曲同工之妙 配置步骤如下: 1.我们首先配置applicationContext.xml,进行扫描 ...

  7. SpringMVC源码分析--容器初始化(四)FrameworkServlet

    在上一篇博客SpringMVC源码分析--容器初始化(三)HttpServletBean我们介绍了HttpServletBean的init函数,其主要作用是初始化了一下SpringMVC配置文件的地址 ...

  8. 2.SpringMVC源码分析:DispatcherServlet的初始化与请求转发

    一.DispatcherServlet的初始化 在我们第一次学Servlet编程,学java web的时候,还没有那么多框架.我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根 ...

  9. SpringMVC源码解析-DispatcherServlet启动流程和初始化

    在使用springmvc框架,会在web.xml文件配置一个DispatcherServlet,这正是web容器开始初始化,同时会在建立自己的上下文来持有SpringMVC的bean对象. 先从Dis ...

随机推荐

  1. 来自官方的一些dbt 最佳实践

    限制对原始数据的依赖性 您的项目将取决于存储在数据库中的原始数据.我们建议制作所谓的“基本模型”,以最大限度地减少对原始数据表的依赖性.在此约定中,基本模型可以具有以下职责: 仅选择与当前分析相关的字 ...

  2. Vquery PHP 简单爬虫类

    http://www.thinkphp.cn/topic/36693.html 在使用php进行网页抓取的时候你有没有感觉到用起来比较麻烦呢?目前我还没有发现php有这样针对网页抓取的类,每次用到这个 ...

  3. tomcat源码阅读之单点登录

    一.SSO概念: 单点登录,Single Sign-On,简写为 SSO,是一个用户认证的过程,允许用户一次性进行认证后,就可访问系统中不同的应用:而无需要访问每个应用时,都重新输入用户和密码. 实现 ...

  4. linux 下git使用教程

    #添加所有新增文件 git add . #提交所有修改,包括删除,添加,修改 git add -A git add --all #查看状态 git status #添加一个文件 git add rea ...

  5. VT-x is not available. (VERR_VMX_NO_VMX) on windows 8

    've installed virtualbox on windows 8 x64, then when I open linux guest machine, I got this error me ...

  6. valgrind的使用--检测内存

    valgrind主要检测内存的使用情况,检测有否内存泄露等. 比如:test_va2.cpp #include<iostream> using namespace std; int mai ...

  7. listener does not currently know of 。。。。

    打开Oracle的 listener.ora 文件: (../oracle/product/10.2.0/db_1/network/admin/listener.ora) 设置环境变量: Oracle ...

  8. 小甲鱼-013元组tuple:上了枷锁的列表

    1.创建和访问一个元组 1.1创建元组 元组的标志性符号是 , tuple1 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) #定义单个元素的元组,要加 , tuple2 = (1 ...

  9. shell 13文件包含

    同其他语言一样,shell也可以包含外部脚本.执行引用脚本可以使用source或 . 示例1 test.sh #shell #!/bin/sh echo "test.sh开始执行" ...

  10. 1033 To Fill or Not to Fill (25 分)

    1033 To Fill or Not to Fill (25 分) With highways available, driving a car from Hangzhou to any other ...