ServletContextListener接口在Spring中的实现

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

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值