首先,说下应用场景。
项目中时常会用到spring项目启动需要加载一些全局数据,如访问数据库获取一些基本公共数据,为此就需要在启动加载时访问数据,为此,专门研究了一下,发现现在网上能搜到的主要是implements InitializingBean, ServletContextAware此方法。
在此,通过实践发现,可以通过一下两种方式实现
1、方式1:implements InitializingBean, ServletContextAware接口,并在spring.xml中配置该bean
<bean id="test1" class="com.util.Test1" ></bean>
代码如下:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.servlet.ServletContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ServletContextAware;
import com.dao.UtilDao;
@Component
@Lazy(false)
public class Test1 implements InitializingBean, ServletContextAware{
@Autowired
private UtilDao utilDao;
public static Map<String,String> cacheShareMap = new HashMap<String,String>();
private Logger log = LoggerFactory.getLogger(Test1.class);
@Override
public void setServletContext(ServletContext sc) {
init();
}
@PostConstruct
private void init() {
log.info("------------------数据初始化开始-------------------");
String sql = "select share_value from tshare t ";
List<Map<String, String>> shareList = (List<Map<String, String>>) utilDao.selectBySql(sql);
if( shareList != null && shareList.size()>0) {
Map<String,String> mapTemp = new HashMap<String,String>();
for(int i=0;i<shareList.size();i++) {
mapTemp.clear();
mapTemp = (Map<String, String>)shareList.get(i);
cachecacheShareMap.put(mapTemp.get("share_value"));
}
}
log.info("------------------数据初始化完成-------------------");
}
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
}
}
2 方式2:比起方式1, 方式2超级简单(哈哈哈哈。。。。)
废话不多说,直接上代码
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.dao.UtilDao;
public class Test2{
@Autowired
private UtilDao utilDao;
public static Map<String,String> cacheMap2 = new HashMap<String,String>();
private Logger log = LoggerFactory.getLogger(Test2.class);
public void init() {
log.info("------------------测试2初始化开始-------------------");
String sql = "select share_value from tshare t ";
List<Map<String, String>> cacheMapList = (List<Map<String, String>>) utilDao.selectBySql(sql);
if(cacheMapList != null && cacheMapList .size()>0) {
Map<String,String> mapTemp = new HashMap<String,String>();
for(int i=0;i<cacheMapLista.size();i++) {
mapTemp.clear();
mapTemp = (Map<String, String>)cacheMapList.get(i);
cacheMap2.put(mapTemp.get("share_value"));
}
}
log.info("------------------测试2初始化完成-------------------");
}
}
关键点来了,那就是在spring.xml中配置bean是,需要配配置init-method属性
<bean id="tes2" class="com.util.Test2" init-method="init"></bean>
这就是最关键的地方,只要配置了init-method="init" 这个"init"就是Test2的init()方法,这样,启动加载bean时就会自动执行init方法,达到初始化数据的目的,全局可用,注意,一定要将调用的全局属性设为静态
public static Map<String,String> cacheDictMap2
OK,一切搞定