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