Spring订购了豆类清单

我有几个bean实现相同的接口。 每个bean都注明了

@Component @Order(SORT_ORDER). public class MyClass implements BeanInterface{ ... } 

有一次我自动assembly一个组件列表,我期待一个排序的bean列表。 bean的列表没有按照我用注释设置的顺序排序。

我尝试实现Ordered接口,并发生相同的行为。

 @Component public class Factory{ @Autowired private List list; // <- I expect a sorted list here ... } 

我做错了吗?

从Spring 4开始,支持订购自动assembly的集合。

请参阅: Spring 4订购自动收集的集合

简介:如果将@Order(value=1) ,@ @Order(value=2) …添加到bean定义中,它们将被注入根据value参数排序的集合中。 这与声明您希望收集按自然顺序不同 – 因为根据Jordi PS的回答 ,您必须在收到列表后自己明确地对列表进行排序。

我找到了解决这个问题的方法,正如你所说,这个注释并不适用于它,尽管它是一个很好的function。

为了使它以这种方式工作,它只需要在包含排序列表的bean中添加以下代码。

 @PostConstruct public void init() { Collections.sort(list,AnnotationAwareOrderComparator.INSTANCE); } 

希望能帮助到你。

@Order注释用于指定执行AOP通知的顺序,它不对列表进行排序。 要在列表上实现排序, BeanInterface类将实现Comparable接口并覆盖compareTo方法以指定对象的排序方式。 然后,您可以使用Collections.sort(list)对列表进行排序。 假设BeanInterface有一个名为getSortOrder的方法,它返回一个指定对象排序顺序的Integer对象,你可以这样做:

 @Component public class MyClass implements BeanInterface, Comparable { public Integer getSortOrder() { return sortOrder; } public int compareTo(BeanInterface other) { return getSortOrder().compareTo(other.getSortOrder()); } } 

然后你可以像这样对列表进行排序:

 Collections.sort(list); 

spring有一个关于这个function的jira问题。 我在评论中添加了beanfactory的实现,我目前正在使用它来支持该function:

https://jira.springsource.org/browse/SPR-5574