Java config для spring interceptor, где перехватчик использует autowired spring beans
Я хочу добавить перехватчик spring mvc как часть конфигурации Java. У меня уже есть конфигурация на основе xml для этого, но я пытаюсь перейти к конфигурации Java. Для перехватчиков я знаю, что это можно сделать так из весенней документации-
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleInterceptor());
}
}
но мой перехватчик использует spring bean autowired в него, как следует -
public class LocaleInterceptor extends HandlerInterceptorAdaptor {
@Autowired
ISomeService someService;
...
}
класс SomeService выглядит следующим образом -
@Service
public class SomeService implements ISomeService {
...
}
я использую аннотации как @Service
для сканирования бобы и не указали их в классе конфигурации как @Bean
как я понимаю, поскольку Java config использует new Для создания объекта, spring не будет автоматически вводить в него зависимости.
как я могу добавить перехватчики, подобные этому, как часть конфигурации java?
3 ответов
просто сделайте следующее:
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
LocaleInterceptor localInterceptor() {
return new LocalInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeInterceptor());
}
}
конечно LocaleInterceptor
должен быть настроен как Spring bean где-то (XML, Java Config или использование аннотаций) для соответствующего поля WebConfig
получить укол.
документация для общей настройки конфигурации MVC Spring может быть найдена здесь, а конкретно для перехватчиков см. этой раздел
когда вы обрабатываете создание объекта для себя, как в:
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() );
}
}
попробуйте ввести свой сервис в качестве параметра конструктора. Это просто.
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
ISomeService someService;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleInterceptor(someService));
}
}
затем перенастроить перехватчик,
public class LocaleInterceptor extends HandlerInterceptorAdaptor {
private final ISomeService someService;
public LocaleInterceptor(ISomeService someService) {
this.someService = someService;
}
}
Ура !