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;
     }


}

Ура !