我的库必须处理多个bean(拦截器),这些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);
}
那么测试将会失败。
从我的调试中,我知道对于这些bean的顺序,AnnotationAwareOrderComparator.findOrder(Object)
总是返回null(未指定)。可能是因为bean实例没有被代理,因此既不实现顺序也没有在它们的类级别上使用顺序注释。是否有BeanPostProcessor或配置选项需要启用?
我该如何告诉Spring要么保留已注释的顺序,要么使用应用程序上下文的bean定义适当地排序bean?
@Bean
声明。Spring在许多地方使用代理和类似的结构,为什么不用于这种情况呢?子类化bean类只是为了设置顺序感觉不对。 - ST-DDT