如何在servlet过滤器中获得Spring Bean?

2022-08-31 22:39:40

我已经定义了一个Java类,我有Spring注释。javax.servlet.Filter

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;

@Configuration
public class SocialConfig {

    // ...

    @Bean
    public UsersConnectionRepository usersConnectionRepository() {
        // ...
    }
}

我想在我的中得到豆子,所以我尝试了以下方法:UsersConnectionRepositoryFilter

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

但它总是返回 。我怎样才能得到一个春豆?nullFilter


答案 1

有三种方法:

  1. 用:WebApplicationContextUtils

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

  3. 在过滤器上使用。不过,我更喜欢另外两个选项之一。(此选项使用 aspectj 编织)@Configurable


答案 2

尝试:

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

Where 是 Bean 在应用程序上下文中的名称/ID。甚至更好:usersConnectionRepository

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

还可以看看GenericFilterBean及其子类。


推荐