博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ssh下:系统初始化实现ServletContextListener接口时,获取spring中数据层对象无效的问题...
阅读量:6708 次
发布时间:2019-06-25

本文共 3129 字,大约阅读时间需要 10 分钟。

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

 

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

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

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

系统初始化类如下:

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

 

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

1 
2
3
contextConfigLocation
4
classpath:applicationContext.xml
5
6 7
8
9
org.springframework.web.context.ContextLoaderListener
10
11 12
13
14
com.lizhou.action.InitAction
15

 

 

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

 

首先,从输出的信息来看,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来管理,也没有效果。

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

 

转载于:https://www.cnblogs.com/wangchaoyuana/p/7523296.html

你可能感兴趣的文章
tomcat并发优化之三种接收处理请求方式(BIO、NIO、APR)介绍
查看>>
应用图片加载服务与第三方实现库的解耦
查看>>
C#调用C/C++ DLL 参数传递和回调函数的总结
查看>>
外包筛选心得
查看>>
Android 悬浮窗权限校验
查看>>
对https的理解
查看>>
七周七语言(6)
查看>>
互斥量和信号量的区别
查看>>
(转)用CSS3移除点击交互元素的高亮背景
查看>>
SpringBoot的注解:@SpringBootApplication注解 vs @EnableAutoConfiguration+@ComponentScan+@Configuration...
查看>>
在网页上嵌入 PowerPoint 演示文稿
查看>>
javascript日期格式化函数,跟C#中的使用方法类似
查看>>
SKY IM-A800S 驱动下载
查看>>
应用程序 数据缓存
查看>>
第二条:遇到多个构造器参数(Constructor Parameters)时要考虑用构建器(Builder)
查看>>
贴片电阻分类、阻值、功率、封装、尺寸
查看>>
【Eclipse】eclipse中设置tomcat启动时候的JVM参数
查看>>
国际化环境下系统架构演化
查看>>
openlayers入门开发系列之批量叠加zip压缩SHP图层篇
查看>>
Javascript调用Webservice的多种方法 .
查看>>