欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Spring在Java Filter注入Bean为Null的问题解决

发布时间:2023/12/9 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Spring在Java Filter注入Bean为Null的问题解决 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

From: https://www.cnblogs.com/EasonJim/p/7666009.html

在Spring的自动注入中普通的POJO类都可以使用@Autowired进行自动注入,但是除了两类:Filter和Servlet无法使用自动注入属性。(因为这两个归Web容器管理)可以用init(集承自HttpServlet后重写init方法)方法中实例化对象。

解决方法:

其中涉及到五种Spring实例化容器对象:

方法一(这种方式不符合Web工程,不要使用):在初始化时保存ApplicationContext对象

ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId");

说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。

方法二(这种方式最简单):通过Spring提供的工具类获取ApplicationContext对象

import org.springframework.web.context.support.WebApplicationContextUtils;ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); ac1.getBean("beanId"); ac2.getBean("beanId");

说明:这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。

实例:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest)request;HttpServletResponse resp = (HttpServletResponse)response;ServletContext sc = req.getSession().getServletContext();XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);if(cxt != null && cxt.getBean("usersService") != null && usersService == null)usersService = (UsersService) cxt.getBean("usersService");Users users = this.usersService.queryByOpenid(openid);

public class WeiXinFilter implements Filter{private UsersService usersService;public void init(FilterConfig fConfig) throws ServletException {ServletContext sc = fConfig.getServletContext(); XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);if(cxt != null && cxt.getBean("usersService") != null && usersService == null)usersService = (UsersService) cxt.getBean("usersService"); }

注意:如果在Spring Boot项目上XmlWebApplicationContext可以不用要,直接使用WebApplicationContext替代。

方法三:继承自抽象类ApplicationObjectSupport

说明:抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。

Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext对象注入。

方法四:继承自抽象类WebApplicationObjectSupport

说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

方法五:实现接口ApplicationContextAware

说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext对象注入。

 

参考:

http://blog.csdn.net/angel708884645/article/details/51148865

http://www.cnblogs.com/digdeep/p/4770004.html

==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==

总结

以上是生活随笔为你收集整理的Spring在Java Filter注入Bean为Null的问题解决的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。