Servlet、Filter、Interceptor中注入Spring Bean

前言

有的时候业务需要可能会在Filter中获取servcie层的对象,如果用传统的依赖注入方式就会报错,出现空指针的情况,这是为什么呢?

因为过滤器初始化的时候,SSM框架中,Bean都是被Spring容器管理的,使用的时候,直接通过注解@Autowired,注入即可。在Filter中,不能使用@Autowired注解注入,通过注解获取到的为null ,Filter并没有被Spring容器管理,它是运行在Tomcat上的,是由Servlet来管理的,Spring容器,有都在容器中的两个对象,才可以使用注解获取 。不在Spring容器中,不被Spring容器管理,根据就不会识别Spring的注解。

解决方法

这个时候有两种解决办法。

实现ApplicationContextAware

ApplicationContextAware 接口的作用

当一个类实现了这个接口之后,这个类就可以方便地获得 ApplicationContext 中的所有bean。换句话说,就是这个类可以直接获取Spring配置文件中,所有有引用到的bean对象。

如何使用 ApplicationContextAware 接口

@Component("applicationContextHelper")
public class ApplicationContextHelper implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        applicationContext = context;
    }

    public static  T getBean(Class clazz) {
        if (applicationContext == null) {
            return null;
        }
        return applicationContext.getBean(clazz);
    }
}

然后再springmvc的配置文件中注册bean。


这样,我们就可以通过该工具类,来获得 ApplicationContext,进而使用其getBean方法来获取我们需要的bean。
注意:一定要让继承ApplicationContextAware接口的bean被Spring上下文管理,在springmvc配置文件中定义对应的bean标签,或者使用@Component标注。

使用

 UserService userService = ApplicationContextHelper.getBean(UserService.class);

方法二

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        ServletContext context = filterConfig.getServletContext();
        ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(context);
        UserService userService= (UserService)ac.getBean("userService");
    }

你可能感兴趣的:(Servlet、Filter、Interceptor中注入Spring Bean)