实现原理
使用static关键字,Bruce Eckel所著的《Thinking in Java》第四版,第五十二页中对static关键字有如下描述:“一旦将什么设为static,数据或方法就不会同那个类的任何实例对象联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据“、““静态”(Static)是指“位于固定位置”(尽管也在 RAM里)。程序运行期间,静 态存储的数据将随时等候调用。可用static 关键字指出一个对象的特定元素是静态的。但 Java 对象本身永 远都不会置入静态存储空间。 ”。被static关键字所修饰的的方法或者属性,在开辟内存空间时只会开辟一个内存空间,也就是说,无论这个类有多少个实例对象,这些对象使用被static关键字修饰的方法或属性时都会指向同一个内存空间。这就为实现加载公共数据到内存提供了可行性。本例中实现类继承了抽象类,如要新加入内存方法,只需继承InitObject类,实现init()和find()方法,在公共类InitDate的cacheList中加入新加入的类的beanName即可。
注本例中的内存管理方法不完全,还有待加强
实现方法
实现代码如下(其中BeanContext是实现BeanFactory的一个实现类,通过IOC获取对象):
主体类
@Component("Init")
public class Init{
private static List<String> cacheList = new ArrayList();
//初始化方法
public void init(){
cacheList.add("RunDate");
loadDate();
new Thread(){
public void run(){
while(run){
try{
Thread.sleep(10000);
loadDate();
} catch (Exception e){
e.printStackTrace();
}
}
}
}.start();
}
public void loadDate(){
for (String beanName : cacheList){
try{
InitObject initObject = BeanContext.getBean(beanName, InitObject.class);
initObject.init();
}catch (Exception e){
e.printStackTrace();
}
}
}
public Map<String, Object> find(String key){
InitObject initObject = BeanContext.getBean(beanName, InitObject.class);
Map<String, Object> map = initObject.find(key);
return map;
}
}
抽象类
public abstract InitObject{
public void init();
public Map<String, Object> find();
}
继承类(其中dao是数据库查询方法)
@Repository("RunDate")
public class RunDate extends InitObject{
@Autowried
private Dao dao;
private static Map<String, Map<String, Object>> map = new HashMap();
@Override
public void init(){
List<Map<String, Object>> lst = dao.getMapper();
String key;
for (Map<String, Object> m : lst){
key = m.get("key1") + "_" + m.get("key2");//可随意写
map.put(key, m);
}
}
@Override
public Map<String, Object> find(String key){
return map.get(key);
}
}
由于本例中结合了SpringMVC,所以在ApplicationContext.xml中加入如下bean即可启动
<bean id="initDate" class="com.initDate" init-method="init"></bean>