前言
有的时候业务需要可能会在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> T getBean(Class<T> clazz) {
if (applicationContext == null) {
return null;
}
return applicationContext.getBean(clazz);
}
}
然后再springmvc的配置文件中注册bean。
<bean class="com.java.common.ApplicationContextHelper" lazy-init="false" />
这样,我们就可以通过该工具类,来获得 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");
}