利用ServletContextListener 获取spring上下文

你的需求是当服务器启动后加载一些数据,我们就可以使用ServletContextListener来满足需求
传统方式

app = new ClassPathXmlApplicationContext("xxx.xml");  

这样获取是不可以的,当j2ee容器启动后会或获取一次spring上下文,如果使用该方式会在一次获取上下文。自己想想就知道.

ServletContextListener 不受spring管理我们应该如何获取呢?

实际上spring同样使用了ServletContextListener接口,我们可以通过实现一个自己的ServletContextListener
来得到spring上下文
代码如下:

package com.xiaomaha.config;  

import java.util.List;  

import javax.servlet.ServletContextEvent;  
import javax.servlet.ServletContextListener;  

import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
import org.springframework.web.context.support.WebApplicationContextUtils;  

public class InitialData implements ServletContextListener {  

    private static List dataList;  

    private ApplicationContext app;  

    public static List getDataList() {  
        return dataList;  
    }  

    public static void setDataList(List dataList) {  
        InitialData.dataList = dataList;  
    }  

    public void contextDestroyed(ServletContextEvent arg0) {  
        // TODO Auto-generated method stub  

    }  

    public void contextInitialized(ServletContextEvent event) {  

        app = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); //获取spring上下文!  
        app.getBean("UserService"); //获取到bean了,你就可以任意搞它了,想怎么搞就怎么搞  
        .............  
        //!最后得到的数据传递给dataList引用就O了!  
    }  

}  

然后在web.xml配置一句

<listener>  
    <listener-class>  
        包+类名  
    </listener-class>  
</listener>  

好了自己写一个类,在构造函数(一般spring都是配置构造函数,当然你也可以使用其它方法)里打印一句话,你可以看看服务器启动后是否会执行两次?

发布了60 篇原创文章 · 获赞 51 · 访问量 32万+
展开阅读全文

ServletContextListener 我想初始化一个方法为啥报空指针异常

03-27

public void contextInitialized(ServletContextEvent event) { // TODO Auto-generated method stub Runnable runnable = new Runnable() { public void run() { addHttpNowData(); } }; ScheduledExecutorService service = Executors .newSingleThreadScheduledExecutor(); // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间 service.scheduleAtFixedRate(runnable, 1, 2, TimeUnit.SECONDS); } public void addHttpNowData() { try { System.out.println(this.getClass().getClassLoader().getResource("/").getPath()); // 从接口获取数据 this.eventNotificationTimedTaskService.addHttpNewNoticeData(); } catch (Exception e) { e.printStackTrace(); } } java.lang.NullPointerException at cn.secure.web.front.EventNotificationTimedTaskController.addHttpNowData(EventNotificationTimedTaskController.java:53) at cn.secure.web.front.EventNotificationTimedTaskController$1.run(EventNotificationTimedTaskController.java:37) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask.runAndReset(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览