spring项目中使用监听器时获取spring中注入的service
来源:互联网 发布:aria2 mac 编辑:程序博客网 时间:2024/05/22 07:44
关闭
转载自:http://blog.lifw.org/post/46428852
1.在java web项目
中我们通常会有这样的需求:当项目启动时执行一些初始化操作,例如从数据库加载全局配置文件等,通常情况下我们会用javaee规范中的Listener去实现,例如
1
2
3
4
5
6
7
8
9
public
class
ConfigListener
implements
ServletContextListener {
@Override
public
void
contextInitialized(ServletContextEvent sce) {
//执行初始化操作
}
@Override
public
void
contextDestroyed(ServletContextEvent sce) {
}
}
2.这样当servlet容器初始化完成后便会调用contextInitialized方法。但是通常我们在执行初始化的过程中会调用service和dao层提供的方法,而现在web项目通常会采用spring框架来管理和装配bean,我们想当然会像下面这么写,假设执行初始化的过程中需要调用ConfigService的initConfig方法,而ConfigService由spring容器管理(标有@Service注解)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public
class
ConfigListener
implements
ServletContextListener {
@Autowired
private
ConfigService configService;
@Override
public
void
contextInitialized(ServletContextEvent sce) {
configService.initConfig();
}
@Override
public
void
contextDestroyed(ServletContextEvent sce) {
}
}
3.然而以上代码会在项目启动时抛出空指针异常!ConfigService实例并没有成功注入。这是为什么呢?要理解这个问题,首先要区分Listener的生命周期和spring管理的bean的生命周期。
(1)Listener的生命周期是由servlet容器(例如tomcat)管理的,项目启动时上例中的ConfigListener是由servlet容器实例化并调用其contextInitialized方法,而servlet容器并不认得@Autowired注解,因此导致ConfigService实例注入失败。
(2)而spring容器中的bean的生命周期是由spring容器管理的。
4.那么该如何在spring容器外面获取到spring容器bean实例的引用呢?这就需要用到spring为我们提供的WebApplicationContextUtils工具类,该工具类的作用是获取到spring容器的引用,进而获取到我们需要的bean实例。代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
public
class
ConfigListener
implements
ServletContextListener {
@Override
public
void
contextInitialized(ServletContextEvent sce) {
ConfigService configService = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(ConfigService.
class
);
configService.initConfig();
}
@Override
public
void
contextDestroyed(ServletContextEvent sce) {
}
}
1
2
3
4
5
6
7
8
9
10
11
12
<
context-param
>
<
param-name
>contextConfigLocation</
param-name
>
<
param-value
>classpath:spring.xml</
param-value
>
</
context-param
>
<
listener
>
<
listener-class
>org.springframework.web.context.ContextLoaderListener</
listener-class
>
</
listener
>
<
listener
>
<
listener-class
>example.ConfigListener</
listener-class
>
</
listener
>
阅读全文
0 0
- spring项目中使用监听器时获取spring中注入的service
- spring项目中使用监听器时获取spring中注入的service
- spring整合的项目中监听器Listener如何获取注入的bean(监听器获取Spring配置文件)
- Java 的监听器中使用 Spring 框架中的某些 service
- Servlet中使用Spring注入Service层
- spring项目中监听器的写法
- session监听器中不能使用spring依赖注入
- 在监听器中注入spring bean
- 在监听器中注入spring bean
- 在Listener(监听器)定时启动的TimerTask(定时任务)中使用Spring@Service注解的bean
- spring与jbpm整合时Action中使用spring注入service方法
- Spring中监听器的详解
- Spring中监听器的详解
- Spring中监听器的详解
- Spring中监听器的详解
- Spring中监听器的详解
- Spring中监听器的详解
- Spring中监听器的详解
- 机器学习:最简明入门指南
- 打造自己的MVC框架
- ecmall 如何新增挂件
- JavaScript中的offset
- .net core 2.0学习笔记(四):迁移.net framework 工程到.net core
- spring项目中使用监听器时获取spring中注入的service
- Powerdesigner16.5将物理模型表中的name在创建数据库时生成对应字段的注释
- jstack
- Python3的Random模块常用函数
- struct结构体初始化3种方法
- linux学习笔记(7)
- 浅谈linux几种定时函数的使用
- android scrollview嵌套listview,高度异常问题解决
- Python 装饰器