Spring Boot应用中Maven依赖的过滤器、拦截器是否会自动生效?
当然存在这种场景,核心原因在于Spring Boot的默认机制和依赖的打包方式,具体分这几种情况:
组件被默认扫描机制捕获
@SpringBootApplication注解本身就包含了@ComponentScan,默认会扫描主类所在包及其所有子包。如果依赖B里的过滤器、拦截器类带有@Component、@WebFilter、@Interceptor这类注解,且它们的包路径刚好落在应用A的扫描范围内(比如A的主类在com.myapp,B的组件在com.myapp.common),Spring会自动把这些组件注册到容器里,自然会作用于入站请求。依赖使用了Spring Boot自动配置
如果B是一个标准的Spring Boot Starter,它大概率会在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports里定义自动配置类。这些配置类会通过@Bean注解直接注册过滤器、解析器或拦截器,哪怕组件不在扫描路径里,只要自动配置的触发条件满足(比如类路径存在指定类、配置项没禁用等),就会被加载生效。举个例子,Spring Security Starter就是这么干的,引入后自动注册一堆过滤器,根本不用你显式调用。Servlet容器SPI机制自动加载
还有一种情况和Spring无关:如果B里的过滤器通过META-INF/services/javax.servlet.Filter文件声明了实现类,Servlet容器(比如Tomcat)会自动发现并加载这些过滤器,直接作用于所有入站请求,不管Spring的配置是什么样的。
总结一下:哪怕你在应用A里没显式调用这些组件,只要满足上面任意一种情况,它们就会自动作用于你的入站请求。
内容的提问来源于stack exchange,提问作者Kris

