Spring MVC Spring Bean 有序列表

i2loujxw  于 2022-11-14  发布在  Spring
关注(0)|答案(5)|浏览(153)

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

我做错什么了吗?

blmhpbnm

blmhpbnm1#

从Spring 4开始支持对自动连接的集合进行排序。
请参阅:Spring 4 Ordering Autowired Collections
总结:如果你把@Order(value=1)@Order(value=2)...添加到bean定义中,它们将被注入到一个按照value参数排序的集合中。这和声明你想要集合按照 * 自然顺序 * 是不一样的--因为你必须在收到列表后自己显式地按照Jordi P.S.'s answer对列表进行排序。

x0fgdtte

x0fgdtte2#

我找到了一个解决这个问题的方法,就像你说的,这个注解并不是为了那个,尽管它会是一个很好的特性。
要使其以这种方式工作,只需在包含排序列表的bean中添加以下代码。

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

希望能有所帮助。

hkmswyz6

hkmswyz63#

关于这个特性在 Spring 有一个jira问题。我在注解中添加了一个beanfactory的实现,我目前正在使用它来支持这个功能:
https://jira.springsource.org/browse/SPR-5574

9cbw7uwe

9cbw7uwe4#

对于Spring版本〈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);
vjhs03f7

vjhs03f75#

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

相关问题