Servlet过滤器作为组件Spring Boot

时间:2016-06-17 20:54:20

标签: spring configuration spring-boot components servlet-filters

我想在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;
      }

   } 

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

@Configuration
public class MyFilter implements Filter{

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

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

   //init and destroy stubs  
        ....    
} 

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

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

1 个答案:

答案 0 :(得分:10)

  

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

它的工作原理是因为除非您提供了显式的注册bean,否则任何Filter bean都会自动注册一些默认配置。

  

2)有没有办法在没有FilterRegistrationBean的情况下设置订单或其他配置,例如网址模式?

您可以使用@Order上的Filter或实施Ordered来设置订单。

如果要设置URL模式

,则应使用注册bean
  

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

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

进行注释
  

4)最后让Filter类本身标记为@ Component / @ Configuration?

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