zoukankan      html  css  js  c++  java
  • Spring在Java Filter注入Bean为Null的问题解决

    在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

  • 相关阅读:
    UIImageView动画 UISlider控制速度
    python学习笔记——装饰器
    python学习笔记——继承
    python学习笔记——异步IO
    思路清楚的最大堆实现
    推荐几个IDEA必备的好用插件
    记工作中遇到的Date类相关的坑
    navicat数据库表数据复制到excel产生的列错位问题
    submit提交时进行页面验证
    SublimeText3常用快捷键和优秀插件(转载)
  • 原文地址:https://www.cnblogs.com/EasonJim/p/7666009.html
Copyright © 2011-2022 走看看