如何在servlet过滤器中获取Spring bean?

Itu*_*blo 40 java spring servlets servlet-filters

我已经定义了一个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() {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想把豆子放进UsersConnectionRepositoryFilter,所以我尝试了以下方法:

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

但它总是回归null.我怎样才能获得一个Spring bean Filter

Boz*_*zho 66

有三种方式:

  1. 用途WebApplicationContextUtils:

    public void init(FilterConfig cfg) { 
        ApplicationContext ctx = WebApplicationContextUtils
          .getRequiredWebApplicationContext(cfg.getServletContext());
        this.bean = ctx.getBean(YourBeanType.class);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用DelegatingFilterProxy- 映射该过滤器,并将过滤器声明为bean.然后,委托代理将调用实现该Filter接口的所有bean .

  3. @Configurable在您的过滤器上使用.我更喜欢其他两个选项中的一个.(此选项使用aspectj编织)

  • 恕我直言,第二个是要走的路.比第一选择更容易测试. (5认同)

Tom*_*icz 33

尝试:

UsersConnectionRepository bean = 
  (UsersConnectionRepository)WebApplicationContextUtils.
    getRequiredWebApplicationContext(filterConfig.getServletContext()).
    getBean("usersConnectionRepository");
Run Code Online (Sandbox Code Playgroud)

usersConnectionRepository应用程序上下文中bean的名称/ id 在哪里.甚至更好:

UsersConnectionRepository bean = WebApplicationContextUtils.
  getRequiredWebApplicationContext(filterConfig.getServletContext()).
  getBean(UsersConnectionRepository.class);
Run Code Online (Sandbox Code Playgroud)

还可以查看GenericFilterBean及其子类.


Ela*_*bak 20

Spring有一个实用工具.

在您的Filter代码中,覆盖init方法,如下所示:

public void init(FilterConfig cfg) { 
    super.init(cfg);
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
Run Code Online (Sandbox Code Playgroud)

然后你只需将bean注入该过滤器,就像你注入的任何其他bean一样.

@Inject
private UsersConnectionRepository repository;
Run Code Online (Sandbox Code Playgroud)