我有几个实现相同接口的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
...
}
我做错什么了吗?
5条答案
按热度按时间blmhpbnm1#
从Spring 4开始支持对自动连接的集合进行排序。
请参阅:Spring 4 Ordering Autowired Collections
总结:如果你把
@Order(value=1)
,@Order(value=2)
...添加到bean定义中,它们将被注入到一个按照value
参数排序的集合中。这和声明你想要集合按照 * 自然顺序 * 是不一样的--因为你必须在收到列表后自己显式地按照Jordi P.S.'s answer对列表进行排序。x0fgdtte2#
我找到了一个解决这个问题的方法,就像你说的,这个注解并不是为了那个,尽管它会是一个很好的特性。
要使其以这种方式工作,只需在包含排序列表的bean中添加以下代码。
希望能有所帮助。
hkmswyz63#
关于这个特性在 Spring 有一个jira问题。我在注解中添加了一个beanfactory的实现,我目前正在使用它来支持这个功能:
https://jira.springsource.org/browse/SPR-5574
9cbw7uwe4#
对于Spring版本〈4,
@Order
注解用于指定AOP建议的执行顺序,它不对列表进行排序。要对列表进行排序,请让BeanInterface
类实现Comparable接口并覆盖compareTo
方法以指定对象的排序方式。然后,您可以使用Collections.sort(list)
对列表进行排序。假设BeanInterface
有一个名为getSortOrder
的方法,该方法返回一个Integer
对象,指定该对象的排序顺序,您可以执行如下操作:然后,您可以按如下方式对列表进行排序:
vjhs03f75#
@Order
注解在此用于救援。我正在使用SpringBoot 2.6.1,它是一个工作代码片段,我没有添加任何
@PostConstruct
来显式地应用排序。下面是接口的多个实现
下面是需要注入MyFilter实现列表的类。