背景:使用监听器处理业务,需要使用自己的service方法;

错误:使用@Autowired注入service对象,最终得到的为null;

原因:listener、fitter都不是Spring容器管理的,无法在这些类中直接使用Spring注解的方式来注入我们需要的对象。

解决:写一个bean工厂,从spring的上下文WebApplicationContext 中获取。

  1. import org.springframework.beans.BeansException;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.ApplicationContextAware;
  4. import org.springframework.stereotype.Component;
  5.  
  6. /**
  7. * @ClassName: SpringJobBeanFactory*/
  8. @Component
  9. public class SpringJobBeanFactory implements ApplicationContextAware {
  10.  
  11. private static ApplicationContext applicationContext;
  12.  
  13. @Override
  14. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  15. SpringJobBeanFactory.applicationContext=applicationContext;
  16.  
  17. }
  18. public static ApplicationContext getApplicationContext() {
  19. return applicationContext;
  20. }
  21. @SuppressWarnings("unchecked")
  22. public static <T> T getBean(String name) throws BeansException {
  23. if (applicationContext == null){
  24. return null;
  25. }
  26. return (T)applicationContext.getBean(name);
  27. }
  28.  
  29. public static <T> T getBean(Class<T> name) throws BeansException {
  30. if (applicationContext == null){
  31. return null;
  32. }
  33. return applicationContext.getBean(name);
  34. }
  35. }

监听器里获取service,使用getBean(XXX.class)

  1. @Override
  2. public void sessionDestroyed(HttpSessionEvent event) {
  3. logger.debug("session销毁了");
  4. UserCountUtils.subtract();//在线人数-1
  5.  
  6. HttpSession session = event.getSession();// 获得Session对象
  7. ServletContext servletContext = session.getServletContext();
  8.  
  9. Account acc = (Account) session.getAttribute("user");
  10. if(acc!=null){
  11. @SuppressWarnings("unchecked")
  12. Map<String, String> loginMap = (Map<String, String>) servletContext.getAttribute("loginMap");
  13. loginMap.remove(acc.getUserName());
  14. servletContext.setAttribute("loginMap", loginMap);
  15. session.removeAttribute("user");
  16. acc.setOnlineState(false); //注销成功修改用户在线状态为 离线
  17. //WebApplicationContext appctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
  18. //AccountService accountService = appctx.getBean(AccountService.class);
  19. AccountService accountService = SpringJobBeanFactory.getBean(AccountService.class);
  20. accountService.updateAccount(acc);
  21. logger.debug(acc.getUserName()+"用户注销!");
  22. }

listener中@Autowired无法注入bean的一种解决方法的更多相关文章

  1. Listener中@Autowired无法注入的问题

    最近在用监听器的时候遇到了spring无法注入的问题,代码如下,这个task总是null,包明明已经被扫到了,就是注入不进来. public class MyListener implements S ...

  2. Springboot中关于跨域问题的一种解决方法

    前后端分离开发中,跨域问题是很常见的一种问题.本文主要是解决 springboot 项目跨域访问的一种方法,其他 javaweb 项目也可参考. 1.首先要了解什么是跨域 由于前后端分离开发中前端页面 ...

  3. 关于八数码问题中的状态判重的三种解决方法(编码、hash、&lt;set&gt;)

    八数码问题搜索有非常多高效方法:如A*算法.双向广搜等 但在搜索过程中都会遇到同一个问题.那就是判重操作(假设反复就剪枝),怎样高效的判重是8数码问题中效率的关键 以下关于几种判重方法进行比較:编码. ...

  4. fluent中UDF环境变量问题的三种解决方法

    方法一: 这种方式最简便,首选这种,但是有时会因为不明原因而不好使,我自己电脑刚开始用这种方式是行得通的,但是后来中途装过很多乱七八糟的软件,估计环境变量改乱了,这时候只能用第二种或者第三种方法.先说 ...

  5. spring 注入bean的两种方式

    我们都知道,使用spring框架时,不用再使用new来实例化对象了,直接可以通过spring容器来注入即可. 而注入bean有两种方式: 一种是通过XML来配置的,分别有属性注入.构造函数注入和工厂方 ...

  6. 检索 COM 类工厂中 CLSID 为 {10020200-E260-11CF-AE68-00AA004A34D5} 的组件时失败,解决方法如下:

    检索 COM 类工厂中 CLSID 为 {10020200-E260-11CF-AE68-00AA004A34D5} 的组件时失败,解决方法如下: 第 一步:首先将msvcr71.dll,  SQLD ...

  7. log4j中Spring控制台输出Debug级信息过多解决方法

    log4j中Spring控制台输出Debug级信息过多解决方法 >>>>>>>>>>>>>>>>> ...

  8. 安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?(总结中)

    安卓(android)建立项目时失败.出现AndroidManifest.xml file missing几种解决方法?(总结中) Eclipse新建项目.遇到这种问题.注意例如以下: 1.文件名称最 ...

  9. universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

    在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使 ...

随机推荐

  1. Github清除历史提交,保留最新提交

    有时候,需要启动一个新的分支,同时想摒弃历史信息,那么可以使用下面的方法来实现 #克隆git仓库 git clone [URL] #进入git仓库 cd [仓库名] #创建一个名为 new_branc ...

  2. Nginx+Tomcat实现动静分离和负载均衡

    一.什么是动静分离? Nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离.严格意义上说应该是将动态请求和静态请求分开,可以理解成使用Nginx处理静态 ...

  3. maven 配置文件

    <properties> <project.builder.sourcesEncoding>UTF-8</project.builder.sourcesEncoding& ...

  4. 201871010107-公海瑜《面向对象程序设计(java)》第二周学习总结

    201871010107-公海瑜<面向对象程序设计(java)>第二周学习总结             项目                          内容   这个作业属于哪个课 ...

  5. POJ2536-Gopher II-(匈牙利算法)

    题意:n只老鼠,m个洞,s秒逃命,逃命速度为v,一个洞只能保住一只老鼠,最少多少只老鼠会被老鹰抓到. 题解:找出每只老鼠有哪些洞可以保命,建立二分图,算出最大匹配,不是求保住命的老鼠,而是求被抓住的老 ...

  6. 【oracle】处理锁表

    查询锁表 select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session swhe ...

  7. Python3 异常

    异常 --- 程序执行时产生的事件,为Python对象 <Python学习手册>笔记 异常总是通过实例对象来识别 默认的异常处理器 --- 打印标准出错信息(包括引发的异常和堆栈跟踪-异常 ...

  8. 请解释一下css3的flexbox(弹性盒布局模型),以及适用场景

    弹性盒模型是c3规范的新的布局方式,该布局模型的目的是提供一种更加高效的方式来对容器的条目进行布局.对齐和分配空间.在传统的布局中,block布局是把块级元素在垂直方向从上向下一次排列的,而inlin ...

  9. windows下socket编程实现client和server双向通信

    服务端代码server.c // server.cpp : Defines the entry point for the console application. // #include <s ...

  10. 洛谷 P1807 最长路_NOI导刊2010提高(07)题解

    相当与一个拓扑排序的模板题吧 蒟蒻的辛酸史 题目大意:给你一个有向无环图,让你求出1到n的最长路,如果没有路径,就输出-1 思路:一开始以为是一个很裸的拓扑排序 就不看题目,直接打了一遍拓扑排序 然后 ...