ServletContextListener接口在Spring中的实现

来源:互联网 发布:淘宝直通车在哪儿 编辑:程序博客网 时间:2024/06/06 12:36

当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;    }    }

阅读全文
0 0
原创粉丝点击