SpringBoot的过滤器拦截器和Autrwired执行顺序
时间: 2025-01-31 14:21:34 浏览: 42
### Spring Boot 过滤器、拦截器与 `@Autowired` 注解的执行顺序
在Spring Boot应用程序中,过滤器(Filter)、拦截器(Interceptor)以及依赖注入(通过`@Autowired`注解完成)有着特定的执行顺序。理解这些组件如何交互对于构建高效的应用程序至关重要。
#### 依赖注入 (`@Autowired`)
当Spring容器启动时,它会扫描带有`@Component`, `@Service`, `@Repository` 或者其他相关注解的类,并创建它们的实例。在此过程中,任何标记有`@Autowired`的地方都会被自动填充相应的bean引用。这意味着所有的依赖项都应在应用上下文完全加载之后立即可用[^2]。
#### Servlet Filters 执行时机
Filters属于Servlet API的一部分,在每次HTTP请求到达Tomcat或其他Servlet容器前被执行。因此,filters会在interceptors之前运行。这是因为filter位于更底层的位置,负责处理所有传入和传出的数据流。一旦filter允许请求继续前进,则会进入到DispatcherServlet阶段[^1]。
#### Interceptor 工作机制
Interceptors由Spring MVC框架管理,主要用于修改或增强控制器层的行为。根据描述,`preHandle()`方法会在实际业务逻辑执行之前触发,即在controller的方法调用之前发生。由于interceptors是由Spring MVC控制的,所以在整个流程里,它们发生在已经经过了filters并且即将访问到具体的handler(比如某个@RequestMapping标注的方法)之间的时间点上[^4]。
综上所述:
- 应用启动期间:先解析并初始化含有`@Autowired`的对象;
- 对于每一个新的HTTP请求:
- 先经历一系列注册过的Servlet filters,
- 接着来到Spring MVC DispatcherServlet处,
- 然后再按照定义好的顺序依次调用各个interceptors中的`preHandle()`,
- 最终才达到目标controller及其内部的具体action函数。
```java
// Example of an Autowired service being used within both Filter and Interceptor.
@Service
public class MyService {
public String getMessage(){
return "Hello from Service";
}
}
@Component
public class MyFilter implements Filter {
private final MyService myService;
@Autowired
public MyFilter(MyService myService){
this.myService = myService;
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
System.out.println(myService.getMessage());
chain.doFilter(req, res);
}
}
```
阅读全文
相关推荐


















