Если я правильно понимаю ваш вопрос, в основном вы хотите определить некоторые общие Interceptors
в нескольких JAR-файлах, чтобы приложение могло активировать эти Interceptors
, просто включив эти JAR-файлы в свое приложение?
Я думал о том, чтобы использовать какой-нибудь композитный конфигуратор
шаблон, где мы перебираем каждый конфигуратор, собираем все перехватчики,
а затем добавить их один раз, но, к сожалению, Spring не позволяет этого.
Какие у меня варианты?
Хорошо, если реализация A возвращает реестр только с перехватчиком A,
и реализация B возвращает реестр только с перехватчиком B, будет
весной объединить оба реестра в один супер реестр, содержащий оба
A и B, или он просто выберет один, или он выдаст ошибку,
не было уникального определения бина?
На самом деле, Spring уже реализовал эту функцию . Когда имеется несколько WebMvcConfigurer
bean-компонентов, Spring просто зацикливает их один за другим и вызывает их методы конфигурации. Таким образом, конечный результат состоит в том, что InterceptorRegistry
будет содержать все перехватчики.
Если клиентскому приложению нужно активировать только определенные WebMvcConfigurer
, оно может просто исключить те JAR-файлы, содержащие WebMvcConfigurer
, которые им не нужны.
Чтобы развить эту идею, позволяющую приложению контролировать, какие Interceptors
активировать вплоть до уровня перехватчика, вы можете даже сделать следующее в каждом общем JAR:
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
//Make sure the HandlerInterceptor implementation in this JAR is a bean (e.g mark it as @Component)
@Autowired
private List<HandlerInterceptor> interceptors;
@Override
public void addInterceptors(InterceptorRegistry registry) {
for(HandlerInterceptor interceptor : interceptors){
registry.addInterceptor(interceptor).addPathPatterns("/api/endpoint/**");
}
}
}
В клиентском приложении используйте includeFilters
/ excludeFilters
в @ComponentScan
, чтобы настроить, какие перехватчики включить. Например, чтобы отключить определенные Interceptors
, вы можете сделать:
@ComponentScan(
basePackages = {"com.company.api"},
excludeFilters={
@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=com.company.common.jar1.Inteceptor1.class) ,
@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=com.company.common.jar2.Inteceptor1.class)
})