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

但数据字典表内容存在于数据库中,使用传统的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;
        }
    }
}
View Code

 

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

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

 

posted on 2018-03-06 18:57  zhaoqiang1980  阅读(672)  评论(0编辑  收藏  举报