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: