注册为Spring bean

时间:2016-09-04 06:31:33

标签: java spring spring-mvc spring-security spring-boot

我想将@AutowireFilter一起使用。所以我在SecurityConfig中定义了我的过滤器,如下所示:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.addFilterBefore(getA(), BasicAuthenticationFilter.class);
        http.csrf().disable();
    }

    @Bean
    public A getA(){
        return new A();
    }

此过滤器A扩展了Spring的GenericFilterBean

当我调用控制器时,我得到低于输出,这表示过滤器命中两次。

filter A before
filter A before
mycontroller invoke
filter A after
filter A after

我的观察是,这个额外的调用使用Spring容器调用,因为如果filter没有注册为bean,它只会被命中一次。是什么原因以及如何解决?

1 个答案:

答案 0 :(得分:17)

正如您所观察到的,Spring Boot将自动使用servlet容器注册任何Filter的bean。一种选择是不将您的过滤器公开为bean,只将其注册到Spring Security。

如果您希望能够将依赖关系自动装入Filter,那么它需要是一个bean。这意味着您需要告诉Spring Boot不要将其注册为过滤器。作为described in the documentation,您使用FilterRegistrationBean

执行此操作
@Bean
public FilterRegistrationBean registration(MyFilter filter) {
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(false);
    return registration;
}