加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

ssh下:系统初始化实现ServletContextListener接口时,获取sprin

发布时间:2020-12-15 01:13:53 所属栏目:大数据 来源:网络整理
导读:想要实现的功能:SSH环境下,数据层都交由Spring管理;在服务启动时,将数据库中的一些数据加载到ServletContext中缓存起来。 ? 系统初始化类需要实现两个接口: ServletContextListener,系统初始化时调用contextInitialized方法缓存数据; ApplicationCont

想要实现的功能:SSH环境下,数据层都交由Spring管理;在服务启动时,将数据库中的一些数据加载到ServletContext中缓存起来。

?

系统初始化类需要实现两个接口:

ServletContextListener,系统初始化时调用contextInitialized方法缓存数据;

ApplicationContextAware,获取Spring的ApplicationContext对象,以获取spring容器管理的service对象。

系统初始化类如下:

 1 package com.lizhou.action;
 2 
 3 import java.util.List;
 4 
 5  javax.servlet.ServletContext;
 6  javax.servlet.ServletContextEvent;
 7  javax.servlet.ServletContextListener;
 8 
 9  org.springframework.beans.BeansException;
10  org.springframework.context.ApplicationContext;
11  org.springframework.context.ApplicationContextAware;
12  org.springframework.stereotype.Component;
13 
14  com.lizhou.entity.ProductBigType;
15  com.lizhou.service.inter.ProductBigTypeServiceInter;
16 
17 /**
18  * 初始化:实现application缓存数据功能
19  * 在服务启动时,将数据库中的数据加载进内存
20  * @author bojiangzhou
21  *
22  */
23 @Component //这里要该注解,不然无法注入ApplicationContext对象
24 public class InitAction implements ServletContextListener,ApplicationContextAware {
25     
26     private ApplicationContext ac;
27     
28     @Override
29     void contextInitialized(ServletContextEvent event) {
30         这里输出当前调用该方法的对象
31         System.out.println("contextInitialized: "+this);
32         
33         获取application
34         ServletContext application = event.getServletContext();
35         获取服务层
36         ProductBigTypeServiceInter bigTypeService = (ProductBigTypeServiceInter) this.ac.getBean("bigTypeService"37         获取商品大类集合
38         List<ProductBigType> bigTypeList = bigTypeService.findAllBigTypeList();
39         保存到application缓存中
40         application.setAttribute("bigTypeList",bigTypeList);
41     }
42     
43 44     void setApplicationContext(ApplicationContext ac) throws BeansException {
45         46         System.out.println("setApplicationContext: "+47         this.ac = ac;
48 49     
50 51      contextDestroyed(ServletContextEvent event) {
52 53 
54 }

?

下面是web.xml里spring和系统初始化的配置:spring是在系统初始化类前加载的

<!-- 添加对spring的支持 -->
 2   <context-param>
 3       param-name>contextConfigLocation</ 4       param-value>classpath:applicationContext.xml 5    6   
 7    定义spring的监听器,加载spring  8   listener 9       listener-class>org.springframework.web.context.ContextLoaderListener10   11   
12    添加自己的初始化action 13   14       >com.lizhou.action.InitAction15   >

?

?

服务启动时,控制台输出如下信息:

?

首先,从输出的信息来看,ApplicationContext对象已经注入进来了;

但是,第36行,也就是通过ApplicationContext来获取服务层对象时报错空指针异常了,说明ApplicationContext为空;

造成这个异常的原因很明显:从输出的两个对象来看,调用setApplicationContext方法和contextInitialized方法不是同一个对象,所以在调用contextInitialized方法时,ApplicationContext还是为Null;

因为调用setApplicationContext方法的对象是由Spring初始化的,而调用contextInitialized方法的对象是由tomcat在加载web.xml时通过反射创建的。

所以两个对象不一致。

?

这里我想到一种解决办法是:将ApplicationContext设置为静态的(static),这样就只有一个ApplicationContext对象了。

?1 private static ApplicationContext ac; 设置为静态?

这样就不会报空指针异常了。一切就OK了!

?

想了想,好像不能将这个初始化类交给Spring来管理,它配置在web.xml中,系统启动时就会触发ServletContextEvent事件,然后调用contextInitialized方法来做初始化工作,它是由tomcat来完成的。即使交由Spring来管理,也没有效果。

如果有其它的办法请分享给我,谢谢!!

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读