我想在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。
答案 0 :(得分:10)
1)即使我注释掉FilterRegistrationBean代码片段也能正常工作。如果我想设置某个顺序,我觉得我必须使用FilterRegistrationBean。正确的吗?
它的工作原理是因为除非您提供了显式的注册bean,否则任何Filter
bean都会自动注册一些默认配置。
2)有没有办法在没有FilterRegistrationBean的情况下设置订单或其他配置,例如网址模式?
您可以使用@Order
上的Filter
或实施Ordered
来设置订单。
如果要设置URL模式
,则应使用注册bean3)我相信我可以使用@Component替换Filter类上的@Configuration注释,它会正常工作吗?
正确。您的过滤器不是配置,因此应使用@Component
而不是@Configuration
4)最后让Filter类本身标记为@ Component / @ Configuration?
是的,可以使用@Component
注释过滤器。另一种方法是在@Bean
类上使用@Configuration
方法。