Servlet过滤器作为组件Spring Boot

Sha*_*yan 6 configuration spring components servlet-filters spring-boot

我想在Spring Boot Web应用程序中配置Servlet过滤器,我想使用@Value注释自动装配一些Beans和属性.我能够使用以下配置实现此目的:

   @Configuration
   public class MyWebConfig{  
      @Autowire
      MyFilter filter;

      @Autowire
      MyAnotherFilter anotherFilter;  

      @Bean
      public FilterRegistrationBean someFilterRegistration() {
           FilterRegistrationBean registration = new  FilterRegistrationBean();
           registration.setFilter(filter);
           registration.setOrder(1);
           return registration;
      }

      @Bean
      public FilterRegistrationBean someFilterRegistration() {
           FilterRegistrationBean registration = new  FilterRegistrationBean();
           registration.setFilter(anotherFilter);
           registration.setOrder(2);
           return registration;
      }

   } 
Run Code Online (Sandbox Code Playgroud)

我已经配置了两个过滤器(为简洁起见只显示一个过滤器):

@Configuration
public class MyFilter implements Filter{

   @Value("${my.property.key}")
   private String myProperty;

   public void doFilter(...){
        ....
   }

   //init and destroy stubs  
        ....    
} 
Run Code Online (Sandbox Code Playgroud)

一切正常.我仍然有一些问题:
1)即使我注释掉FilterRegistrationBean代码片段也是如此.如果我想设置某个顺序,我觉得我必须使用FilterRegistrationBean.正确?
2)有没有什么方法可以设置订单或其他配置,如没有FilterRegistrationBean的网址模式?
3)我相信我可以使用@Component可以替换Filter类上的@Configuration注释,它会正常工作吗?
4)最后将Filter类本身标记为@ Component/@Configuration是否合适?

请注意,我在主应用程序类上使用@SpringBootApplication.

And*_*son 10

1)即使我注释掉FilterRegistrationBean代码片段也能正常工作.如果我想设置某个顺序,我觉得我必须使用FilterRegistrationBean.正确?

它的工作原理是因为任何Filterbean都会自动注册一些默认配置,除非你提供了一个显式的注册bean.

2)有没有什么方法可以设置订单或其他配置,如没有FilterRegistrationBean的网址模式?

您可以通过使用设置顺序@Order上的Filter,或具有实现Ordered.

如果要设置URL模式,则应使用注册Bean

3)我相信我可以使用@Component可以替换Filter类上的@Configuration注释,它会正常工作吗?

正确.您的过滤器不是配置,因此应该使用@Component而不是注释@Configuration

4)最后将Filter类本身标记为@ Component/@Configuration是否合适?

是的,用它来注释过滤器就可以了@Component.另一种@Bean方法是在@Configuration类上使用方法.