Моя библиотека имеет дело с несколькими bean-компонентами (перехватчиками), которые указаны в произвольном порядке (потому что они распределены по нескольким файлам конфигурации).
Прежде чем я смогу применить их, я должен отсортировать их по приоритету. Я использую AnnotationAwareOrderComparator.sort(beans)
для этого. Это хорошо работает до тех пор, пока на уровне класса этого перехватчика добавляется аннотация @Order
.
Но он не работает, когда я пытаюсь использовать его в классах @Configuration для методов @Bean:
@Configuration
public class Config {
@Bean
@Order(1)
public ServerInterceptor exceptionTranslatingServerInterceptor() {
return ...;
}
@Bean
@Order(2)
public ServerInterceptor authenticatingServerInterceptor() {
return ...;
}
@Bean
@Order(3)
public ServerInterceptor authorizationCheckingServerInterceptor() {
return ...
}
}
Но если я добавлю такой тест:
@Test
void testOrderingOfTheDefaultInterceptors() {
List<ServerInterceptor> expected = new ArrayList<>();
expected.add(applicationContext.getBean(ExceptionTranslatingServerInterceptor.class));
expected.add(applicationContext.getBean(AuthenticatingServerInterceptor.class));
expected.add(applicationContext.getBean(AuthorizationCheckingServerInterceptor.class));
List<ServerInterceptor> actual = new ArrayList<>(this.registry.getServerInterceptors());
assertEquals(expected, actual); // Accidentally passes
// System.out.println(actual);
Collections.shuffle(actual);
AnnotationAwareOrderComparator.sort(actual);
assertEquals(expected, actual); // Fails
// System.out.println(actual);
}
Тогда тест не пройден.
Из своей отладки я знаю, что AnnotationAwareOrderComparator.findOrder(Object)
всегда возвращает ноль (не указано) для порядка этих бинов. Возможно, потому что экземпляры bean-компонентов не проксируются и, таким образом, не реализуют порядок и не имеют аннотации порядка на своем уровне класса. Есть ли BeanPostProcessor или опция конфигурации, которую я должен включить?
Как мне сказать Spring либо сохранить аннотированный порядок, либо использовать определения bean-компонентов контекста приложения для соответствующей сортировки bean-компонентов?