当web容器加载时初始化操作
通常程序的数据库中会有常量表。对这些表数据,我们一般会有很多地方要对其进行查询操作,但是单独查一个常量进行一次数据库连接的话,显然有点多余。
因此,我们可以实现ServletContextListener接口,在其的contextInitialized()
方法中实现在容器加载的时候查询一次,将其的所有数据都取出放入内存中。
/**
* 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,
* 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
*/
contextInitialized(ServletContextEvent sce)
话不多说,直接上代码:
public class InitAppkeyListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
try {
CallerAppkeyDao callerAppkeyDao = SpringFactory.getBean(CallerAppkeyDao.class);
List<CallerAppkey> list = callerAppkeyDao.queryAppkeyList();
arg0.getServletContext().setAttribute(Const.APPKEY_LIST, list);
AppkeyUtils.sc = arg0;//查询到的数据存放进工具类的静态属性中
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后需要在web.xml 中进行如下配置,以使得该监听器可以起作用:
<listener>
<listener-class>com.main.open.common.InitAppkeyListener</listener-class>
</listener>
当和spring组合使用时,需要在spring的配置文件中配置:
<!-- 配置 BeanFactoryAwarebean -->
<bean id="springFactory" class="com.main.open.utils.SpringFactory" scope="singleton"/>
由SpringFactory在容器加载时取到实体对象。
SpringFactory工具类:
public class SpringFactory implements BeanFactoryAware {
private static BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory factory) throws BeansException {
SpringFactory.beanFactory = factory;
}
/**
* 根据beanName名字取得bean
*
* @param beanName
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String beanName) {
if (null != beanFactory) {
return (T) beanFactory.getBean(beanName);
}
return null;
}
/**
* 根据beanName名字取得bean
*
* @param beanName
* @return
*/
public static <T> T getBean(Class<T> clz) {
if (null != beanFactory) {
return (T) beanFactory.getBean(clz);
}
return null;
}
}
然后你只需要建立一个工具类,就能直接通过这个工具类取到这个表里的数据了。
public class AppkeyUtils {
public static ServletContextEvent sc;
public static CallerAppkey queryAppkeyByKey(String key) {
if (StringUtils.isEmpty(key)) {
return null;
}
if (null != sc) {
List<CallerAppkey> list = (List<CallerAppkey>) sc.getServletContext().getAttribute(Const.APPKEY_LIST);
for (CallerAppkey callerAppkey : list) {
if (key.equals(callerAppkey.getAppkey())) {
return callerAppkey;
}
}
}
return null;
}
}