如何使用 Spring Boot 过滤器注册 Bean 将依赖项注入 Servlet 过滤器?

我正在注册的 Spring Boot (2.0.1) 应用程序中有一个 Servlet 过滤器FilterRegistrationBean,我需要它在过滤器链中首先执行(一个顺序)。应用程序部署到JBoss 7.2。这个过滤器也有一个注入的依赖项@Autowired(见下文):


package my.pkg.com

@SpringBootApplication

@ComponentScan(basePackages={"my.pkg.com"})

public class MyApp extends SpringBootServletInitializer {

  public satic void main(String[] args) throws IOException {

    SpringApplication.run(MyApp.class, args);

  }


  @Bean

  @Order(1)

  public FilterRegistrationBean<MyFilter> myFilter() {

    FilterRegistrationBean<MyFilter> contextFilter = new FilterRegistrationBean<>();

    contextFilter.setFilter(new MyFilter());

    contextFilter.addUrlPattern("/api/*");

    return contextFilter;

  }

}



package my.pkg.com.filter


public class MyFilter extends Filter {


  @Autowired

  private MyService mySrv;



  @Override


  public void doFilter(…) {


    mySrv.doSomething(); // mySrv is null

  }

}

问题是当应用程序部署和运行时,当 Servlet 请求到达时MyFilter.doFilter(),mySrv为 null,这意味着MyFilter从未扫描过依赖注入。


我可以通过调试验证MyService哪个@Repositoryinmy.package.com.repository包确实被初始化了。它永远不会被注入到MyFilter.


MyFilter我可以为take创建一个构造函数MyService,然后@Autowired MyService在MyApp过滤器注册期间,我可以将它传递给这个构造函数,这样就解决了这个问题。


MyFilter但是,我想知道是否有什么我做错了,因为单独使用上面的设置没有注入这种依赖性。


侃侃无极
浏览 133回答 2
2回答

慕田峪9158850

如果你自己创建一个对象,使用new,并且这个对象不是由@Bean-annotated 方法返回的,那么它就不是 Spring bean,因此 Spring 不会向其中注入任何东西。您可以只添加一个带@Bean 注释的方法返回new MyFilter(),然后调用该方法myFilter()以获取 bean,或者将一个MyFilteras 参数添加到myFilter().例子:@Bean@Order(1)public FilterRegistrationBean<MyFilter> myFilter() {&nbsp; &nbsp; FilterRegistrationBean<MyFilter> contextFilter = new FilterRegistrationBean<>();&nbsp; &nbsp; contextFilter.setFilter(theActualFilter());&nbsp; &nbsp; contextFilter.addUrlPattern("/api/*");&nbsp; &nbsp; return contextFilter;}@Bean&nbsp;public MyFilter theActualFilter() {&nbsp; &nbsp; return new MyFilter(); // now this is a Spring bean}或者@Bean@Order(1)public FilterRegistrationBean<MyFilter> myFilter(MyFilter theActualFilter) {&nbsp; &nbsp; FilterRegistrationBean<MyFilter> contextFilter = new FilterRegistrationBean<>();&nbsp; &nbsp; contextFilter.setFilter(theActualFilter);&nbsp; &nbsp; contextFilter.addUrlPattern("/api/*");&nbsp; &nbsp; return contextFilter;}@Bean&nbsp;public MyFilter theActualFilter() {&nbsp; &nbsp; return new MyFilter(); // now this is a Spring bean}

慕虎7371278

很简单,@Component在你的过滤器类上添加注解,它会让@Autowired注解在内部工作,因为 Spring 依赖注入将处理你的过滤器类并注入服务 bean。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java