我怎样才能得到一个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及其子类。
有三种方法:
-
使用
WebApplicationContextUtils
:public void init(FilterConfig cfg) { ApplicationContext ctx = WebApplicationContextUtils .getRequiredWebApplicationContext(cfg.getServletContext()); this.bean = ctx.getBean(YourBeanType.class); }
-
使用
DelegatingFilterProxy
– 映射该filter,并将filter声明为bean。 委托代理将调用实现Filter
接口的所有Bean。 -
在您的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; }