项目需求是在启动服务时,将某些内容放入到共同里面,例如数据字典表内容。
但数据字典表内容存在于数据库中,使用传统的listener在加载时,无法获取service实例,打开事务控制。
springmvc提供了几个接口,可以在启动时执行。
InitializingBean和ServletContextAware都可以添加。
因加载的内容大多都是全局共用,因此可用servletContext来存储,在使用的地方获取即可。
如果使用单例模式存储对象,可使用InitializingBean,将数据放入到单例对象中。
/*** 系统初始化完毕后则会执行此方法
* @Description:
*@authorDennyZhao
* @date 2018年3月6日
*@version1.0*/
public class InitDataListener implementsInitializingBean,ServletContextAware {/*** 单位名称服务类*/@InjectprivateUnitService unitService;/*** 列表服务类*/@InjectprivateItemsService itemsService;/*** 根据单位服务类获取单位名称*/@Overridepublic void afterPropertiesSet() throwsException {
SingleItems singleItem=SingleItems.getInstance();//获取所有的单位名称
List unitAllList =unitService.getUnitAllList();
List unitNameList = new ArrayList();
unitAllList.forEach(unitDO->{
unitNameList.add(unitDO.getUnitName());
});
singleItem.setUnitNameList(unitNameList);//获取所有的列表
Map> allItemsMap =itemsService.getAllItemsMap();
singleItem.setItemMap(allItemsMap);
}
@Overridepublic voidsetServletContext(ServletContext servletContext) {
}
}
单例对象见Java下的单例模式:
packagecom.pccw.solutions.retire.common.model;importjava.io.Serializable;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.inject.Singleton;importorg.apache.commons.collections.MapUtils;/*** 创建单例模式对象,全局共用一个对象,将所有的查询Item结果放入到此对象中
* @Description:
*@authorDennyZhao
* @date 2018年3月6日
*@version1.0*/@Singletonpublic class SingleItems implementsSerializable{/*** 自动生成序列号*/
private static final long serialVersionUID = -3893810440799071288L;/*** 实例对象*/
private static final SingleItems SINGLE_ITEMS = newSingleItems();/*** 单位名称列表*/
private List unitNameList = new ArrayList();/*** Item全局对象*/
private Map> itemMap = new HashMap>();privateSingleItems() {
}/*** set ItemMap
*@paramitemMap*/
public void setItemMap(Map>itemMap) {synchronized (this.itemMap){if(this.itemMap != null && !MapUtils.isEmpty(this.itemMap)) {return;
}this.itemMap =itemMap;
}
}/*** 获取单例对象
*@return
*/
public staticSingleItems getInstance() {returnSINGLE_ITEMS;
}/*** 单位名称检查
*@paramunitName
*@return
*/
public booleancheckUnitName(String unitName) {returnunitNameList.contains(unitName);
}/*** 添加内容
*@paramitemType
*@paramitemList*/
public void addItem(String itemType, ListitemList) {synchronized(itemMap){//判断是否已经存在
if(itemMap.containsKey(itemType)) {return;
}//添加
itemMap.put(itemType, itemList);
}
}/*** 根据项类型,和项名称判断是否存在此名称
*@paramitemType
*@paramitemName
*@return
*/
public booleancheckItem(String itemType, String itemName) {
List itemList =itemMap.get(itemType);if(itemList == null || itemList.size() == 0) {return false;
}returnitemList.contains(itemName);
}/*** 获取Item列表*/
public ListgetItem(String itemType){
List itemList =itemMap.get(itemType);returnitemList;
}/*** 移除内容*/
public voidremoveItem(String itemType) {synchronized (this.itemMap){//判断是否已经存在
if(!itemMap.containsKey(itemType)) {return;
}//移除内容
itemMap.remove(itemType);
}
}/***@paramunitNameList the unitNameList to set*/
public void setUnitNameList(ListunitNameList) {synchronized (this.unitNameList){if(this.unitNameList != null && this.unitNameList.size() > 0) {return;
}this.unitNameList =unitNameList;
}
}
}
View Code
然后在dispatcher-servlet.xml中加入bean,或者在spring-bean.xml中,注意bean的位置要放在service注解被装载到spring容器中,且事务控制之后。