项目需求是在启动服务时,将某些内容放入到共同里面,例如数据字典表内容。
但数据字典表内容存在于数据库中,使用传统的listener在加载时,无法获取service实例,打开事务控制。
springmvc提供了几个接口,可以在启动时执行。
InitializingBean和ServletContextAware都可以添加。
因加载的内容大多都是全局共用,因此可用servletContext来存储,在使用的地方获取即可。
如果使用单例模式存储对象,可使用InitializingBean,将数据放入到单例对象中。
/** * 系统初始化完毕后则会执行此方法 * @Description: * @author DennyZhao * @date 2018年3月6日 * @version 1.0 */ public class InitDataListener implements InitializingBean,ServletContextAware { /** * 单位名称服务类 */ @Inject private UnitService unitService; /** * 列表服务类 */ @Inject private ItemsService itemsService; /** * 根据单位服务类获取单位名称 */ @Override public void afterPropertiesSet() throws Exception { SingleItems singleItem = SingleItems.getInstance(); // 获取所有的单位名称 List<UnitDO> unitAllList = unitService.getUnitAllList(); List<String> unitNameList = new ArrayList<String>(); unitAllList.forEach(unitDO -> { unitNameList.add(unitDO.getUnitName()); }); singleItem.setUnitNameList(unitNameList); // 获取所有的列表 Map<String, List<String>> allItemsMap = itemsService.getAllItemsMap(); singleItem.setItemMap(allItemsMap); } @Override public void setServletContext(ServletContext servletContext) { } }
单例对象见Java下的单例模式:
创建模式--单例模式Singleton(JAVA)
package com.pccw.solutions.retire.common.model; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Singleton; import org.apache.commons.collections.MapUtils; /** * 创建单例模式对象,全局共用一个对象,将所有的查询Item结果放入到此对象中 * @Description: * @author DennyZhao * @date 2018年3月6日 * @version 1.0 */ @Singleton public class SingleItems implements Serializable{ /** * 自动生成序列号 */ private static final long serialVersionUID = -3893810440799071288L; /** * 实例对象 */ private static final SingleItems SINGLE_ITEMS = new SingleItems(); /** * 单位名称列表 */ private List<String> unitNameList = new ArrayList<String>(); /** * Item全局对象 */ private Map<String, List<String>> itemMap = new HashMap<String, List<String>>(); private SingleItems() { } /** * set ItemMap * @param itemMap */ public void setItemMap(Map<String, List<String>> itemMap) { synchronized (this.itemMap){ if(this.itemMap != null && !MapUtils.isEmpty(this.itemMap)) { return; } this.itemMap = itemMap; } } /** * 获取单例对象 * @return */ public static SingleItems getInstance() { return SINGLE_ITEMS; } /** * 单位名称检查 * @param unitName * @return */ public boolean checkUnitName(String unitName) { return unitNameList.contains(unitName); } /** * 添加内容 * @param itemType * @param itemList */ public void addItem(String itemType, List<String> itemList) { synchronized (itemMap){ // 判断是否已经存在 if(itemMap.containsKey(itemType)) { return; } // 添加 itemMap.put(itemType, itemList); } } /** * 根据项类型,和项名称判断是否存在此名称 * @param itemType * @param itemName * @return */ public boolean checkItem(String itemType, String itemName) { List<String> itemList = itemMap.get(itemType); if(itemList == null || itemList.size() == 0) { return false; } return itemList.contains(itemName); } /** * 获取Item列表 */ public List<String> getItem(String itemType){ List<String> itemList = itemMap.get(itemType); return itemList; } /** * 移除内容 */ public void removeItem(String itemType) { synchronized (this.itemMap){ // 判断是否已经存在 if(!itemMap.containsKey(itemType)) { return; } // 移除内容 itemMap.remove(itemType); } } /** * @param unitNameList the unitNameList to set */ public void setUnitNameList(List<String> unitNameList) { synchronized (this.unitNameList){ if(this.unitNameList != null && this.unitNameList.size() > 0) { return; } this.unitNameList = unitNameList; } } }
然后在dispatcher-servlet.xml中加入bean,或者在spring-bean.xml中,注意bean的位置要放在service注解被装载到spring容器中,且事务控制之后。
<!-- 初始化操作 -->
<bean id="initDataListener" class="com.*.common.listener.InitDataListener"></bean>