我有几个实现相同接口的bean。 每个bean都注明了
@Component
@Order(SORT_ORDER).
public class MyClass implements BeanInterface{
...
}
有一次,我会自动发送一个组件列表,我期待一个排序的bean列表。 bean的列表没有按照我用注释设置的顺序进行排序。
我尝试实现Ordered接口,并发生相同的行为。
@Component
public class Factory{
@Autowired
private List<BeanInterface> list; // <- I expect a sorted list here
...
}
我做错了吗?
答案 0 :(得分:15)
从Spring 4开始支持订购自动装配的集合。
请参阅:Spring 4 Ordering Autowired Collections
摘要:如果将@Order(value=1)
,@Order(value=2)
...添加到bean定义中,它们将被注入根据value
参数排序的集合中。这与声明您希望自然顺序中的集合不同 - 因为根据Jordi P.S.'s answer,您必须在收到列表后自行对列表进行显式排序。
答案 1 :(得分:12)
我找到了解决问题的方法,正如你所说,这个注释并不适用于它,尽管这是一个很好的功能。
为了使它以这种方式工作,只需要在包含排序列表的bean中添加以下代码。
@PostConstruct
public void init() {
Collections.sort(list,AnnotationAwareOrderComparator.INSTANCE);
}
希望它有所帮助。
答案 2 :(得分:0)
@Order
注释用于指定执行AOP通知的顺序,它不对列表进行排序。要在列表上实现排序,您的BeanInterface
类将实现Comparable接口并覆盖compareTo
方法以指定对象的排序方式。然后,您可以使用Collections.sort(list)
对列表进行排序。假设BeanInterface
有一个名为getSortOrder
的方法,它返回一个指定对象排序顺序的Integer
对象,你可以这样做:
@Component
public class MyClass implements BeanInterface, Comparable<BeanInterface> {
public Integer getSortOrder() {
return sortOrder;
}
public int compareTo(BeanInterface other) {
return getSortOrder().compareTo(other.getSortOrder());
}
}
然后你可以像这样对列表进行排序:
Collections.sort(list);
答案 3 :(得分:0)
春天有一个关于这个功能的jira问题。我在评论中添加了beanfactory的实现,我当前用它来支持该功能: