【问题标题】:Spring ordered list of beansSpring有序的bean列表
【发布时间】:2013-06-02 19:24:20
【问题描述】:

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

我做错了什么吗?

【问题讨论】:

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


    【解决方案1】:

    从 Spring 4 开始支持订购自动装配的集合。

    见:Spring 4 Ordering Autowired Collections

    总结:如果您将@Order(value=1)@Order(value=2)... 添加到您的bean 定义中,它们将被注入到根据value 参数排序的集合中。这与声明您希望以自然顺序的集合不同 - 因为您必须在收到列表后自己显式地对列表进行排序,根据Jordi P.S.'s answer

    【讨论】:

    • 这对许多人有用,但不能回答实际问题。此外,最好将信息放在答案本身中,以防博客消失。我进行了编辑以添加摘要。
    【解决方案2】:

    正如你所说,我找到了解决问题的方法,尽管它是一个不错的功能,但此注释并不意味着它。

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

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

    希望对你有帮助。

    【讨论】:

    • Spring 4 还是这样吗?
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      @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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        • 2010-12-04
        • 2011-04-27
        相关资源
        最近更新 更多