用于弹簧拦截器的 Java 配置,其中拦截器使用自动连接的弹簧豆

2022-09-01 06:28:22

我想添加弹簧mvc拦截器作为Java配置的一部分。我已经有一个基于xml的配置,但我正在尝试迁移到Java配置。对于拦截器,我知道可以从春季文档中像这样完成 -

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

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

}

但是我的拦截器正在使用弹簧豆自动连接到它,如下所示 -

public class LocaleInterceptor extends HandlerInterceptorAdaptor {

    @Autowired
    ISomeService someService;

    ...
}

SomeService 类如下所示-

@Service
public class SomeService implements ISomeService {

   ...
}

我正在使用诸如扫描bean之类的注释,并且没有在配置类中将它们指定为@Service@Bean

据我所知,由于java配置使用new来创建对象,因此spring不会自动将依赖项注入其中。

如何将这样的拦截器添加为 java 配置的一部分?


答案 1

只需执行以下操作:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

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

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

}

当然,需要在某个地方(XML,Java配置或使用注释)配置为Spring bean,以便注入相关字段。LocaleInterceptorWebConfig

可以在此处找到有关Spring的MVC配置的一般自定义的文档,特别是对于Interceptors,请参阅本节


答案 2

当您为自己处理对象创建时,例如:

registry.addInterceptor(new LocaleInterceptor());

Spring容器无法为您管理该对象,因此无法将必要的注入到您的.LocaleInterceptor

另一种可能更适合您的情况的方法是在 中声明托管并直接使用该方法,如下所示:@Bean@Configuration

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public LocaleInterceptor localeInterceptor() {
        return new LocaleInterceptor();
    }

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

推荐