我有兴趣从Spring ApplicationContext
获取一个bean列表。特别是,这些是Ordered
bean
@Component
@Order(value=2)
我在一些未启用Spring的遗留代码中,所以我制作了一个获取ApplicationContext
的方法。对于春豆,我知道我可以做类似的事情:
@Bean
public SomeType someType(List<OtherType> otherTypes) {
SomeType someType = new SomeType(otherTypes);
return someType;
}
但是ApplicationContext
只提供了一个返回无序地图的方法getBeansOfType
。我已经尝试了getBeanNames(type)
,但这也会使无序的东西返回。
我唯一能想到的是创建一个只包含List的虚拟类,为该虚拟类创建一个bean并检索有序列表:
public class DumbOtherTypeCollection {
private final List<OtherType) otherTypes;
public DumbOtherTypeCollection(List<OtherType) otherTypes) {
this.otherTypes = otherTypes;
}
List<OtherType> getOrderedOtherTypes() { return otherTypes; }
}
@Bean
DumbOtherTypeCollection wasteOfTimeReally(List<OtherType otherTypes) {
return new DumbOtherTypeCollection(otherTypes);
}
....
applicationContext.getBean(DumbOtherTypeCollection.class).getOrderedOtherTypes();
希望我能做得更好。
答案 0 :(得分:3)
Spring可以将类型的所有bean自动装配到列表中。除此之外,如果您的bean使用@Ordered
注释,或者bean实现Ordered
接口,那么此列表将包含所有bean。(Spring reference)
@Autowired
docs:
如果是Collection或Map依赖类型,容器将自动装配与声明的值类型匹配的所有bean。
@Autowired
List<MyType> beans;
编辑:使用内置的OrderComparator进行订购
对于外部上下文调用,为了让您的bean按其顺序排列优先级,您可以采用内置比较器的优先级:
org.springframework.core.annotation.AnnotationAwareOrderComparator(new ArrayList(applicationContext.getBeansOfType(...).values()));
或
Collections.sort((List<Object>)applicationContext.getBeansOfType(...).values(),org.springframework.core.annotation.AnnotationAwareOrderComparator.INSTANCE);