如何在Java的Filter中注入Service???
今天在做用户使用cookie自动登录的时候,发现在LoginFilter中读取到cookie以后要进行查询数据库然后进行用户名和密码的比对,查询数据库肯定要用到Service和Dao,一开始我以为在service属性上直接使用注解就能搞定,没想到啊,还是报了空指针异常。类似下面这样(这样是注入不进来的)
@Autowired
private UserService userService;
先给大家说说为什么在Filter中注入不进来service
我建立一个全局拦截器,当然,我把它命名为LoginFilter,它继承了Filter,web应用启动的顺序是:listener->filter->servlet,而因为项目应用了spring mvc,所以我们会有一个配置文件(applixationContext.xml),我们在配置spring时会用到spring的listener,它会读取application.xml里的配置对spring context进行初始化;项目启动时,先初始化listener,因此配置在applicationContext.xml里的bean会被初始化和注入;然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初始化,没法注入。
遇到一个问题,我们要知其然,并且知其所以然,知道原因以后下面就是解决了!
今天就来教大家怎么在Java的Filter中注入Service
1、在我们的LoginFilter中加入需要注入的属性
/**
* userService属性
*/
private UserService userService;
2、在LoginFilter的init()方法中获取 ServletContext
①这里有三种方式获取ServletContext
1)在javax.servlet.Filter中直接获取
ServletContext context = config.getServletContext();
2)在HttpServlet中直接获取
this.getServletContext()
3)在其他方法中,通过HttpServletRequest获得
request.getSession().getServletContext();
3、然后在LoginFilter中获取我们的WebApplicationContext上下文
WebApplicationContext cxt =WebApplicationContextUtils.getWebApplicationContext(sc);
从下面spring源码的可以看到WebApplicationContextUtils.getWebApplicationContext(sc)需要传入一个ServletContext对象(就是我们上面获取的)我们把sc放进去
public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
}
4、从WebApplicationContext上下文中获取bean,赋值给我们的userService
userService = (UserService) cxt.getBean(UserService.class);
这样就完成注入了 ,是不是很方便呢!
下面小编把部分源码放上面,方便大家参考:
public class LoginFilter implements Filter {
protected static final Logger logger = Logger.getLogger(LoginFilter .class);
private FilterConfig config;
/**
* userService属性(作者的企鹅群:162582394密码1欢迎进群交流学习)
*/
private UserService userService;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
config = filterConfig;
/**
* 注入service 用户查询数据库
*/
ServletContext sc = filterConfig.getServletContext();
WebApplicationContext cxt =WebApplicationContextUtils.getWebApplicationContext(sc);
if(cxt != null && cxt.getBean(UserService.class) != null && userService == null){
userService = (UserService) cxt.getBean(UserService.class);
}
} } }
然后我们就可以调用userService中的方法了:
JSONObject data =userService.userLogin(userName,passWord);
如何在Java的Filter中注入Service???的更多相关文章
- 如何在Java Filter 中注入 Service
在项目中遇到一个问题,在 Filter中注入 Serivce失败,注入的service始终为null.如下所示: public class WeiXinFilter implements Filter ...
- 在Java filter中调用service层方法
在项目中遇到一个问题,在 Filter中注入 Serivce失败,注入的service始终为null.如下所示: public class WeiXinFilter implements Filter ...
- 关于如何在Listener中注入service和ServletContextListener源码分析
今天在做项目时突然发现我该如何向listener中注入service对象,因为监听器无法使用注解注入. 此时有人会想用以下代码通过xml的方式注入: ApplicationContext cont ...
- Filter 中注入失败问题
参考: https://www.cnblogs.com/digdeep/p/4770004.html?tvd https://www.cnblogs.com/EasonJim/p/7666009.ht ...
- java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序
过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt.紧接着执行chain.doFilter()之后的代码 ...
- 工具类中注入service和dao
今天编写了个工具类需要用到service成和dao层的代码 如下: //第一步:需要将工具类注入到容器中 @Component public class RuleUtils { //第二部注入 @ ...
- Spring注解问题,[action中注入service失败
pring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- 如何在java中用Arraylist中实现冒泡排序的问题
众所周知,冒泡排序法在一般数组中就3步, if(a<b){ temp=a; a=b; b=temp; } 然而,在集合中就不是简单的交换一下了,因为交换之后,必须保证新的值被重新设置到集合中去. ...
- 【tmos】如何在Interceptor拦截器中注入其他数据
光是这样是获取不到weixinConfig内容的 public class WebLoginInterceptor implements HandlerInterceptor { @Autowired ...
随机推荐
- 转:java 进阶之路
转: https://www.zhihu.com/question/39139518 一.基础篇1.1 JVM1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http:// ...
- 开源框架Quartz动态加入、改动和删除定时任务 (二)
貌似每次回过头去看之前写的一些东西,总感觉不是非常完美~~虽说不做完美人.但也要做完美事!这次主要是针对Quartz的动态维护和Spring集成.简单粗暴一点,直接上代码,有什么不了解留言交流 先来一 ...
- 以前积攒的一个用Java程序生成验证码的代码
一个Java类: package com.abc.ufo.util; import java.awt.Color; import java.awt.Font; import java.awt.Grap ...
- HDU1157 Who's in the Middle
Who's in the Middle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- linux 网络性能优化
最近在对程序进行调优,涉及到了网络通信,学习了一下对网络调优的方法,网上的资料很多,针对软件优化方面,大体上主要有两种方式:一是网卡参数,另一个是内核参数. 一. 网卡参数优化 针对网卡参数优化,需要 ...
- 自定义ios NSLog
#ifdef DEBUG #define MyLog(FORMAT, ...) fprintf(stderr,"Time:%s\t File:%s\t Methods:%s\t Line:% ...
- Python课程之元组
元组(Tuple) 一.定义: 与列表(list)不同的是,元组不支持修改,但是若元组中的元素本身是可变对象,如列表,则可以修改.元素之间用逗号隔开,并且元素的类型可以任意. 二.操作: 1.创建:直 ...
- Python技术公众号100天了
公众号100天了,是个值得一提的日子! 我从2017年10月31日开始做这个公众号,到今天2018年2月7日,差不多100天时间 .虽然公众号很早就申请了,但直到去年10月31日,我才有真正把这个公众 ...
- Python3 range()函数
Python3 range() 函数用法 Python3 内置函数 Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表. Pyth ...
- shell脚本中处理 路径中中文和空格方法
OLDIFS=$IFS IFS=$'\n' #存放路径的变量在引用时都使用双引号括起来 "$VAR_PATH" #路径拼接时后续的旧不需要加双引号了"$VAR_PATH& ...