解决Springboot中Interceptor拦截器中依赖注入失败

本文介绍如何在Java配置中设置Spring MVC拦截器,并解决拦截器依赖注入的问题。通过@Bean注解定义拦截器实例,确保Spring能够正确地管理依赖关系。

I want to add spring mvc interceptor as part of Java config. I already have a xml based config for this but I am trying to move to a Java config. For interceptors, I know that it can be done like this from the spring documentation-

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleInterceptor());
    }

}

But my interceptor is using a spring bean autowired into it like follows-

public class LocaleInterceptor extends HandlerInterceptorAdaptor {

    @Autowired
    ISomeService someService;

    ...
}

The SomeService class looks like follows-

@Service
public class SomeService implements ISomeService {

   ...
}

I am using annotations like @Service for scanning the beans and have not specified them in the configuration class as @Bean

As my understanding, since java config uses new for creating the object, spring will not automatically inject the dependencies into it.

How can I add the interceptors like this as part of the java config?

 

 

Answers

 

34down voteaccepted

Just do the following:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    LocaleInterceptor localInterceptor() {
         return new LocalInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeInterceptor());
    }

}

Of course LocaleInterceptor needs to be configured as a Spring bean somewhere (XML, Java Config or using annotations) in order for the relevant field of WebConfig to get injected.

The documentation for general customization of Spring's MVC configuration can be found here, and specifically for Interceptors see this section

<think>首先,用户的问题是:"我想了解springboot项目中拦截器和过滤器的区别 请问Spring Boot项目里拦截器和过滤器的区别"。根据系统指令,我必须使用中文回答,确保行内数学表达式用$...$,独立公式用$$...$$,但这个问题是关于Spring Boot的,没有数学表达式,所以不需要。 用户提供了引用:[^1], [^2], [^3], [^4],这些是关于Spring Boot中过滤器和拦截器的文章。作为AI,我应该基于这些引用和我的知识来回答。 系统指令包括:"回答中引用的段落末尾自然地添加引用标识",所以我需要在回答中引用时添加引用标识如[^1]。 还要"生成相关问题",在回答结束时添加相关问题。 回答的结构要清晰,逐步解决问题,保证真实可靠。 关键点:用户想知道Spring Boot项目中拦截器和过滤器的区别。 从引用中提取信息: - [^1]: 讨论过滤器和拦截器的概念,提到它们用于预处理和后处理HTTP请求和响应,但有差异。 - [^2]: 专门比较过滤器(Filter)和拦截器Interceptor)的区别。 - [^3]: 详细解释拦截器和过滤器的工作原理、使用场景和实现方法。 - [^4]: 提供一个示例,配置拦截器在登录验证中。 具体区别: - **过滤器(Filter)**: 是Servlet规范的一部分,在请求到达Servlet之前或响应发送之后执行。过滤器可以拦截所有请求,包括静态资源。在Spring Boot中,可以通过实现javax.servlet.Filter接口或使用FilterRegistrationBean注册。 - **拦截器Interceptor)**: 是Spring框架的一部分,在Spring MVC中执行。它作用于控制器(Controller)方法之前和之后,以及视图渲染之前。拦截器只能拦截Spring管理的请求,不能拦截静态资源。 主要区别: 1. **作用范围**: - 过滤器:作用于整个Web应用,拦截所有请求,包括静态资源。 - 拦截器:作用于Spring MVC框架内,只拦截控制器处理的请求。 2. **执行顺序**: - 在请求处理中,过滤器先于拦截器执行。顺序是:Filter -> DispatcherServlet -> Interceptor -> Controller。 3. **配置方式**: - 过滤器:通过web.xml或FilterRegistrationBean注册。 - 拦截器:通过实现HandlerInterceptor接口并在WebMvcConfigurer中配置。 4. **依赖**: - 过滤器:不依赖Spring容器,是Servlet标准。 - 拦截器:依赖Spring容器,是Spring MVC的一部分。 5. **功能**: - 过滤器:主要用于通用处理如编码设置、日志记录、安全过滤(如登录验证)。 - 拦截器:更适合于Spring特定操作,如权限检查、数据绑定、异常处理。 从引用中提到: - [^2]: "过滤器(Filter)和拦截器Interceptor)有什么区别?" 参考它。 - [^3]: 解释了工作原理和使用场景。 回答结构: 1. **介绍**:简要说明过滤器和拦截器的概念和作用。 2. **详细区别**:列出关键区别点。 3. **总结**:归纳何时使用哪种。 4. **生成相关问题**:在结束时提出问题。 参考引用时自然添加,例如在提及特定点后添加[^1], [^2], etc。 最终添加相关问题。 </think>### Spring Boot项目中拦截器和过滤器的区别 在Spring Boot项目中,过滤器和拦截器都是用于处理HTTP请求的常用组件,但它们在工作原理、作用范围、执行顺序和配置方式上存在显著差异。理解这些区别有助于开发者在实际应用中合理选择和使用。以下我将基于引用内容,逐步解析两者的关键区别,并给出总结。 #### 1. **定义和作用范围** - **过滤器(Filter)**: - 过滤器是Servlet规范的一部分(javax.servlet.Filter),作用于整个Web应用,包括静态资源(如CSS、JS文件)。它在请求到达Servlet之前或响应发送之后执行,主要用于通用预处理和后处理,比如设置字符编码、记录日志、安全过滤(如登录验证)[^1][^2]。 - 在Spring Boot中,过滤器通常通过实现Filter接口并使用FilterRegistrationBean注册: ```java public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { // 预处理逻辑 chain.doFilter(request, response); // 继续执行链 // 后处理逻辑 } } ``` 然后在配置类中注册: ```java @Bean public FilterRegistrationBean<MyFilter> filterRegistrationBean() { FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new MyFilter()); bean.addUrlPatterns("/*"); // 拦截所有请求 return bean; } ``` - **拦截器Interceptor)**: - 拦截器是Spring MVC框架的一部分(HandlerInterceptor),仅作用于Spring管理的控制器(Controller)层。它在请求进入控制器方法之前、之后或视图渲染之前执行,主要用于Spring特定逻辑,如权限校验、数据绑定、异常处理[^2][^3]。 - 拦截器无法处理静态资源,因为它依赖DispatcherServlet。在Spring Boot中,通过实现HandlerInterceptor接口并在WebMvcConfigurer中配置: ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 控制器方法执行前的逻辑 return true; // 返回true继续流程 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { // 控制器方法执行后、视图渲染前的逻辑 } } ``` 然后在配置类中注册拦截路径: ```java @Configuration public class MyMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**") // 拦截所有控制器路径 .excludePathPatterns("/login/**", "/static/**"); // 排除静态资源 } } ``` 参考[^4]中的登录验证示例。 #### 2. **执行顺序和位置** - **执行流程**: - 在HTTP请求处理中,过滤器的执行先于拦截器。标准顺序为: 1. 过滤器(Filter)→ 2. DispatcherServlet(Spring MVC核心)→ 3. 拦截器Interceptor)→ 4. 控制器(Controller)[^1][^2]。 - 例如:一个请求首先被过滤器处理(如设置编码),然后传递给Spring的DispatcherServlet,再经过拦截器(如权限检查),最后到达控制器。 - **关键点**: - 过滤器在Servlet层执行,适用于所有Web请求。 - 拦截器在Spring MVC层执行,仅作用于控制器方法调用的前后阶段[^3]。 #### 3. **配置方式和依赖** - **配置方式**: - 过滤器:通过Servlet原生方式(如web.xml)或Spring Boot的FilterRegistrationBean注册。不依赖Spring容器,可以独立于Spring框架使用[^1]。 - 拦截器:必须通过Spring的WebMvcConfigurer接口配置(如addInterceptors方法)。它依赖于Spring IoC容器,只能用于Spring Boot项目中[^3][^4]。 - **依赖关系**: - 过滤器:基于Java EE标准,无需Spring支持。 - 拦截器:是Spring MVC的一部分,需要Spring上下文管理其生命周期。 #### 4. **使用场景和优缺点** - **过滤器适用场景**: - 全局性处理:如跨域设置(CORS)、请求压缩、日志记录。 - 安全过滤:例如登录验证(但需注意,过滤器更适合基础验证)。 - 优点:覆盖范围广,能处理静态资源。 - 缺点:无法访问Spring上下文,难以处理Spring特定逻辑(如依赖注入Bean)[^1][^2]。 - **拦截器适用场景**: - Spring相关逻辑:如权限控制(如基于用户的角色校验)、数据校验、性能监控。 - 优点:与Spring无缝集成,可直接使用@Autowired注入Bean。 - 缺点:无法拦截静态资源,仅限于控制器请求[^3][^4]。 #### 5. **总结对比** | 特点 | 过滤器(Filter) | 拦截器Interceptor) | |--------------------|----------------------------------------|----------------------------------------| | **所属规范** | Servlet规范 | Spring MVC框架 | | **作用范围** | 所有HTTP请求(包括静态资源) | 仅Spring控制器请求 | | **执行顺序** | 先于拦截器执行 | 在过滤器之后、控制器前后执行 | | **配置方式** | FilterRegistrationBean或web.xml | WebMvcConfigurer.addInterceptors | | **依赖容器** | 不依赖Spring(Servlet容器) | 依赖Spring IoC容器 | | **适用场景** | 通用底层处理(如编码、日志) | Spring逻辑处理(如权限、数据绑定) | | **静态资源处理** | 支持 | 不支持 | 在实际项目中: - 优先使用拦截器处理业务逻辑(如权限校验),因为它与Spring集成更紧密[^4]。 - 过滤器更适合底层基础设施任务(如请求过滤),尤其是需要处理静态资源时[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值