【原创】SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存,利用Spring托管,并完成reload功能

来源:互联网 发布:高德地图端口修改工具 编辑:程序博客网 时间:2024/05/21 04:00

各位看官,请做好心理准备,这个帖子会很长,因为小弟已经做好写很长的准备。

 

现在说一下需求,这次的项目是做一个水产养殖相关的项目,系统开启以后很多地方要用到数据库里的字典数据,比如部门表,养殖对象表,这些数据是可变的,但是变化频率很小,所有每次用到的时候都去数据库取数据很明显的是对资源的浪费,所以想按照以前的方法把数据从数据库里读取出来,放到内存,每次用到的时候直接去内存找就可以了。想法应该是正确的,可是用到了SSH框架,做起来就有点小困难了,研究了一下午,总是是搞定。思路和代码写出来,有错误的地方请大家指正。

 

正式开始!中间的调错过程省去,直接如何实现。

 

         另配一个listener,和spring同时启动,不可取。因为listener的启动机制貌似是线程,并不是按顺序一个一个启动,所有想到直接在spring的配置文件里,注册bean文件,让bean文件来执行取数据的工作,但是这个bean显然是不能使用DAO的类,因为DAO层的东西无法注入进来,所以要有个替代的东西,这个东西好难找啊,就是BeanPostProcessor接口,用类PBSTrackManagerPostProcessor实现它其中的一个方法postProcessAfterInitialization,这个方法里可以引入一个类GetDictionaryInfo,实现类的方法getAllInfo(),当getAllInfo去调用DAO层的数据时就可以了。

不说了,直接上源码:

PBSTrackManagerPostProcessor.java

 

GetDictionaryInfo.java

 

 

然后这个GetDictionaryInfo.java是个普通的类,所有要有一个servlet启动并且把取得HaspMap放到context里去

 

MainServlet.java

 

 

 

然后完成注册功能

applicationContext.XML

 

 

配置web.xml让MainServlet.java自启动

 

 

 

然后就是如何在Action里取到数据了:

 

 

 

 

又一个问题就是解决触发一个函数,让这些东西重新加载。

 

 

 

reloadDictionaryInfoMap();实现起来时比较困难的,要在GetDictionaryInfo 取到ServletContext,而且要必须取到第一次实例的GetDictionaryInfo ,所有有一个东西很好用,就是Spring的context,取到他的方式

 

 

 

 

这样就大功告成,跑起来以后的结果,列出控制台的输出数据:

 

 

终于写完,请大家指正。

 

 

原创粉丝点击