Servlet 过滤器作为组件 Spring Boot
Posted
技术标签:
【中文标题】Servlet 过滤器作为组件 Spring Boot【英文标题】:Servlet Filter as Component Spring Boot 【发布时间】:2016-10-19 19:17:22 【问题描述】:我想在 Spring Boot Web 应用程序中配置 Servlet 过滤器,并且我想使用 @Value 注释自动装配一些 Bean 和属性。我能够使用以下配置来实现这一点:
@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) 最后,将过滤器类本身标记为@Component/@Configuration 是否很好?
请注意,我在主应用程序类上使用 @SpringBootApplication。
【问题讨论】:
【参考方案1】:1) 即使我注释掉 FilterRegistrationBean 一段代码,它也能正常工作。如果我想设置某些顺序,我觉得我必须使用 FilterRegistrationBean。对吗?
它之所以有效,是因为任何Filter
bean 都会使用一些默认配置自动注册,除非您提供了显式注册 bean。
2) 有什么方法可以在没有 FilterRegistrationBean 的情况下设置订单或其他配置,例如 url 模式?
您可以通过在您的Filter
上使用@Order
或让它实现Ordered
来设置顺序。
如果你想设置 URL 模式,你应该使用注册 bean
3) 我相信我可以使用@Component 可以替换Filter 类上的@Configuration 注解并且它会正常工作?
正确。您的过滤器未配置,因此应使用 @Component
而不是 @Configuration
进行注释
4) 最后,将 Filter 类本身标记为 @Component/@Configuration 是否很好?
是的,可以使用@Component
注释过滤器。另一种方法是在@Configuration
类上使用@Bean
方法。
【讨论】:
以上是关于Servlet 过滤器作为组件 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章