我怎样才能得到一个servletfilter中的Spring bean?

我已经定义了一个javax.servlet.Filter并且我有Spring类注解的Java类。

 import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Bean; @Configuration public class SocialConfig { // ... @Bean public UsersConnectionRepository usersConnectionRepository() { // ... } // ... } 

我想在我的Filter获得Bean UsersConnectionRepository ,所以我尝试了以下方法:

 public void init(FilterConfig filterConfig) throws ServletException { UsersConnectionRepository bean = (UsersConnectionRepository) filterConfig.getServletContext().getAttribute("#{connectionFactoryLocator}"); } 

但是它总是返回null 。 我怎样才能得到一个Filter的Spring bean?

尝试:

 UsersConnectionRepository bean = (UsersConnectionRepository)WebApplicationContextUtils. getRequiredWebApplicationContext(filterConfig.getServletContext()). getBean("usersConnectionRepository"); 

其中usersConnectionRepository是应用程序上下文中的bean的名称/标识。 甚至更好:

 UsersConnectionRepository bean = WebApplicationContextUtils. getRequiredWebApplicationContext(filterConfig.getServletContext()). getBean(UsersConnectionRepository.class); 

也看看GenericFilterBean及其子类。

有三种方法:

  1. 使用WebApplicationContextUtils

     public void init(FilterConfig cfg) { ApplicationContext ctx = WebApplicationContextUtils .getRequiredWebApplicationContext(cfg.getServletContext()); this.bean = ctx.getBean(YourBeanType.class); } 
  2. 使用DelegatingFilterProxy – 映射该filter,并将filter声明为bean。 委托代理将调用实现Filter接口的所有Bean。

  3. 在您的filter上使用@Configurable 。 我宁愿其他两个选项之一。 (这个选项使用aspectj编织)

spring只是为了这个工具。

在你的Filter代码中,像这样覆盖init方法:

 public void init(FilterConfig cfg) { super.init(cfg); SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); } 

然后,你只需@注入你的bean到filter,就像你要注入的任何其他bean一样。

 @Inject private UsersConnectionRepository repository; 

将这个扩展到下面的类

 abstract public class SpringServletFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { //must provide autowiring support to inject SpringBean SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, filterConfig.getServletContext()); } @Override public void destroy() { } abstract public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException; }