Java 的监听器中使用 Spring 框架中的某些 service

本文介绍了如何在Java的监听器中正确使用Spring框架中的Service。由于监听器不属于Spring管理范围,直接使用@Resource注解会抛出null指针异常。解决方法是实现Spring的ServletContextListener接口,待Spring上下文初始化完成后,通过查找Spring容器获取Service。通过这种方法,可以在监听器中安全地使用Spring Service。

为方便有时希望在监听器中使用 Spring 框架中的某些 service,但是因为监听器属于sevlet容器,不属于 Spring 框架的管理范围,所以如果期望监听器中直接使用 @Resource 等注解加载 service 的做法是错误,报 null 指针异常,那如果图简单想直接使用,正确做法是实现 Spring 的 ServletContextListener 接口,在 Spring 上下文初始化事件完成后,再查找 Spring 框架中(上下文)的对应的 service 然后再提供给监听器使用,代码如下:

package com.xxx.yyy.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.WebApplicationContext;

import com.xxx.yyy.entity.Member;
import com.xxx.yyy.module.service.MemberService;

/**
 * @author shenzhenNBA
 * @since 2017.04.17
 */

//@Slf4j
public class AppSessionListener implements ServletContextListener,HttpSessionListener { 
	//@Resource //监听器属于sevlet容器而非spring管理范围,故不能使用注解方式加载相关实例
    private MemberService memberService;
	
	@Override
	public void sessionCreated(HttpSessionEvent hse) {
		HttpSession session = hse.getSession(); 
		// session createed to do...
		
		
	}	
		
	@Override
	public void sessionDestroyed(HttpSessionEvent hse) {
		HttpSession session = hse.getSession(); 
		try {
			String memberId = (String)session.getAttribute("memberId");
			Member member = memberService.findByMemberId(memberId);
			//to do more when session destroyed...
			
			
		} catch (Exception e) {
			//log.error("异常!", e);
		}
		
	}
	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		ServletContext servletContext = sce.getServletContext();
		ApplicationContext context = (ApplicationContext) servletContext.getAttribute(
				WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 
		
		//initialize service when spring context initialized,
		//建立对应的service当spring上下文初始化之后
		//使用spring框架中已经初始化的memberService
		memberService = (MemberService)context.getBean(MemberService.class);
		//to do more...
		
	}
		
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}
		
}

web.xml 配置 listener

<listener> 
	listener-class>com.xxx.yyy.listener.AppSessionListener</listener-class> 
</listener>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值