Spring订购了豆类清单

时间:2013-06-06 17:00:21

标签: java spring sorting spring-mvc ioc-container

我有几个实现相同接口的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
    ...
}

我做错了吗?

4 个答案:

答案 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的实现,我当前用它来支持该功能:

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