需求:
1.项目开发中会有一些平凡使用的数据需要加载到内存中;以减少数据库交互次数.降低服务器和数据库压力.
思路:
3.在监听到容器创建完成后,将为Dic类中的静态变量赋值;
优劣势:
1.减少web服务与数据库的交互次数,减轻双方压力;
环境:
import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; 过程:
1.创建一个类实现接口
ApplicationListener<ContextRefreshedEvent>,并将这个类用@component标签扫描入Spring的对象管理池; @Componentpublic class AppSpringEventListener implements ApplicationListener { @Override public void onApplicationEvent(ContextRefreshedEvent arg0) { //spring会调用两次这个方法,因为启动时会创建了两个容器(root application context 和projectName-servlet context), //我们只在root上下文创建成功后执行这个方法,初始化参数 if(arg0.getApplicationContext().getParent()==null){ //初始化数据字典 DictionariesHelper.getInstance().init(); //初始化省市县字典 RegionHelper.getInstance().init(); } }}
2.在DictionariesHelper类中定义静态变量用于存储字典信息,在RegionHelper中定义静态变量用于存储省市县信息;
@Componentpublic class DictionariesHelper { private static final Logger log = LoggerFactory.getLogger(DictionariesHelper.class); //按层级存储字典信息 private static Map
public class RegionHelper { private static final Logger log = LoggerFactory.getLogger(RegionHelper.class); private static Map regionDictionaries = new LinkedHashMap (); private static RegionHelper regionHelper; //service组件 private static DataDictionariesServise dataDictionariesServise; private static List
getRegionZTreeDataByRegionCode
String ztreeData = RegionHelper.getRegionZTreeDataByRegionCode("XXX");//调用字典内存数据List dicList = DictionariesHelper.getDicListByType("xxx");
原理:
1.Spring会在web容器创建完成时调用SpringApplicationListener接口中的onApplicationEvent方法,所以我们自定义类实现
SpringApplicationListener接口,重写onApplicationEvent方法.以便spring在容器完成创建事件后调用我的实现类,运行自定义方法. 总结:
1.使用@Component标注两个工具类是为了可以使用@Autowired标签帮助我将service对象注入对象中;
2.不能在在声明service对象的属性名上直接使用@Autowired标签,那样的话值注不进去还spring报错(不清楚为什么).所以我写了set方法用于注入service;
3.在两个Helper类中,我用于存储数据的都是LinkedHashMap,而不是HashMap,因为,字典和省市县在读取数据时很多时候都会排序的寻求.而HashMap是无序的.这样就算我在SQL中将数据排序.当放入Map中时又变成无序的了.而LinkedHashMap会记录数据进入的循序.这样的话就可以满足我排序的要求;
4.在
SpringApplicationListener中的onApplicationEvent方法中我做了一个if判断,是因为Spring在启动中会在两个容器创建时(root application context和projectName-servlet context).其中projectName-servlet context是root application context的子容器.所以,我们判断当当前容器的父容器是空时(也就是root application context),才执行我们的初始化方法.