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
    ...
}

我做错什么了吗?

4

5 回答 5

27

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

请参阅:Spring 4 订购 Autowired 集合

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

于 2015-03-05T17:50:39.017 回答
21

正如您所说,我找到了该问题的解决方案,尽管它是一个不错的功能,但此注释并不适用。

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

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

希望能帮助到你。

于 2013-06-07T09:56:30.997 回答
2

The @Order annotation is used to specify the order in which AOP advice is executed, it doesn't sort lists. To achieve sorting on your list have your BeanInterface classes implement the Comparable interface and override the compareTo method to specify how the objects should be sorted. Then you can sort the list using Collections.sort(list). Assuming BeanInterface has a method called getSortOrder that returns an Integer object specifying the object's sort order, you could do something like this:

@Component 
public class MyClass implements BeanInterface, Comparable<BeanInterface> {
    public Integer getSortOrder() {
        return sortOrder;
    }

    public int compareTo(BeanInterface other) {
        return getSortOrder().compareTo(other.getSortOrder());
    }
}

Then you can sort the list like this:

Collections.sort(list);
于 2013-06-06T20:35:01.450 回答
1

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

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

于 2013-06-07T05:28:24.600 回答
0

@Order注释在这里进行救援。

我正在使用SpringBoot 2.6.1,它对我来说是一个工作代码片段,没有添加任何@PostConstruct明确应用排序的代码。

interface MyFilter {
  
}

下面是接口的多种实现

@Order(value=1)
public class MyFilterImpl1 implements MyFilter {
} 


@Order(value=2)
public class MyFilterImpl2 implements MyFilter {
} 


@Order(value=3)
public class MyFilterImpl3 implements MyFilter {
} 

下面是需要注入 MyFilter 实现列表的类。

@Component
    @RequiredArgConstructor
    public class MyBean {
     private final List<MyFilter> myFilters;
    }
于 2022-02-23T10:48:48.343 回答