一、@autowired注入集合顺序源码分析 spring 5.3.2
1、线程调用链

2、注入主要逻辑
//org.springframework.beans.factory.support.defaultlistablebeanfactory#resolvemultiplebeans
@nullable
private object resolvemultiplebeans(dependencydescriptor descriptor, @nullable string beanname,
@nullable set<string> autowiredbeannames, @nullable typeconverter typeconverter) {
class<?> type = descriptor.getdependencytype();
if (descriptor instanceof streamdependencydescriptor) {
map<string, object> matchingbeans = findautowirecandidates(beanname, type, descriptor);
if (autowiredbeannames != null) {
autowiredbeannames.addall(matchingbeans.keyset());
}
stream<object> stream = matchingbeans.keyset().stream()
.map(name -> descriptor.resolvecandidate(name, type, this))
.filter(bean -> !(bean instanceof nullbean));
if (((streamdependencydescriptor) descriptor).isordered()) {
stream = stream.sorted(adaptordercomparator(matchingbeans));
}
return stream;
}
//支持数组
else if (type.isarray()) {
class<?> componenttype = type.getcomponenttype();
resolvabletype resolvabletype = descriptor.getresolvabletype();
class<?> resolvedarraytype = resolvabletype.resolve(type);
if (resolvedarraytype != type) {
componenttype = resolvabletype.getcomponenttype().resolve();
}
if (componenttype == null) {
return null;
}
//找到容器中匹配得实例<实例名,对象>
map<string, object> matchingbeans = findautowirecandidates(beanname, componenttype,
new multielementdescriptor(descriptor));
if (matchingbeans.isempty()) {
return null;
}
if (autowiredbeannames != null) {
autowiredbeannames.addall(matchingbeans.keyset());
}
//类型转换器
typeconverter converter = (typeconverter != null ? typeconverter : gettypeconverter());
//把找到的实例转换成需要的类型
object result = converter.convertifnecessary(matchingbeans.values(), resolvedarraytype);
if (result instanceof object[]) {
//近似看成得到一个annotationawareordercomparator外部比较器
/**
* 实际是得到一个ordercomparator对象 重写了compare方法 调用annotationawareordercomparator的docompare方法
**/
comparator<object> comparator = adaptdependencycomparator(matchingbeans);
if (comparator != null) {
//排序**********
arrays.sort((object[]) result, comparator);
}
}
return result;
}
//支持collection及其子类 必须为接口
else if (collection.class.isassignablefrom(type) && type.isinterface()) {
class<?> elementtype = descriptor.getresolvabletype().ascollection().resolvegeneric();
if (elementtype == null) {
return null;
}
//找到容器中匹配得实例<实例名,对象>
map<string, object> matchingbeans = findautowirecandidates(beanname, elementtype,
new multielementdescriptor(descriptor));
if (matchingbeans.isempty()) {
return null;
}
if (autowiredbeannames != null) {
autowiredbeannames.addall(matchingbeans.keyset());
}
//类型转换器
typeconverter converter = (typeconverter != null ? typeconverter : gettypeconverter());
//把找到的实例转换成需要的类型
object result = converter.convertifnecessary(matchingbeans.values(), type);
//只有是list集合 才会排序
if (result instanceof list) {
if (((list<?>) result).size() > 1) {
//近似看成得到一个annotationawareordercomparator外部比较器
/**
* 实际是得到一个ordercomparator对象 重写了compare方法 调用annotationawareordercomparator的docompare方法
**/
comparator<object> comparator = adaptdependencycomparator(matchingbeans);
if (comparator != null) {
//排序**********
((list<?>) result).sort(comparator);
}
}
}
return result;
}
//支持map类型 只能为map
else if (map.class == type) {
resolvabletype maptype = descriptor.getresolvabletype().asmap();
class<?> keytype = maptype.resolvegeneric(0);
if (string.class != keytype) {
return null;
}
class<?> valuetype = maptype.resolvegeneric(1);
if (valuetype == null) {
return null;
}
//找到容器中匹配得实例<实例名,对象>
map<string, object> matchingbeans = findautowirecandidates(beanname, valuetype,
new multielementdescriptor(descriptor));
if (matchingbeans.isempty()) {
return null;
}
if (autowiredbeannames != null) {
autowiredbeannames.addall(matchingbeans.keyset());
}
return matchingbeans;
}
else {
return null;
}
}
3、annotationawareordercomparator比较器核心代码
3.1、首先来看两个重要类的继承结构
annotationawareordercomparator类继承结构

priorityordered类继承结构

3.2 、比较器核心代码
调用顺序
ordercomparator#docompare org.springframework.core.ordercomparator#getorder(java.lang.object, org.springframework.core.ordercomparator.ordersourceprovider) org.springframework.core.annotation.annotationawareordercomparator#findorder org.springframework.core.ordercomparator#findorder org.springframework.core.ordercomparator#getorder(java.lang.object)
//org.springframework.core.ordercomparator#docompare
private int docompare(@nullable object o1, @nullable object o2, @nullable ordersourceprovider sourceprovider) {
boolean p1 = (o1 instanceof priorityordered);
boolean p2 = (o2 instanceof priorityordered);
/**
* priorityordered接口实例和非priorityordered接口实例比较priorityordered实例放前面
**/
if (p1 && !p2) {
return -1;
}
else if (p2 && !p1) {
return 1;
}
int i1 = getorder(o1, sourceprovider);
int i2 = getorder(o2, sourceprovider);
return integer.compare(i1, i2);
}
//org.springframework.core.ordercomparator#getorder(java.lang.object, org.springframework.core.ordercomparator.ordersourceprovider)
private int getorder(@nullable object obj, @nullable ordersourceprovider sourceprovider) {
integer order = null;
if (obj != null && sourceprovider != null) {
object ordersource = sourceprovider.getordersource(obj);
if (ordersource != null) {
if (ordersource.getclass().isarray()) {
for (object source : objectutils.toobjectarray(ordersource)) {
order = findorder(source);
if (order != null) {
break;
}
}
}
else {
order = findorder(ordersource);
}
}
}
return (order != null ? order : getorder(obj));
}
//org.springframework.core.ordercomparator#getorder(java.lang.object)
protected int getorder(@nullable object obj) {
if (obj != null) {
integer order = findorder(obj);
if (order != null) {
return order;
}
}
//如果没有获取到排序值 返回返回最大排序值即放到最后
return ordered.lowest_precedence;
}
//org.springframework.core.ordercomparator#findorder
@nullable
protected integer findorder(object obj) {
//得到ordered接口中的排序值 priorityordered也是ordered子类 没实现ordered接口接口返回null
return (obj instanceof ordered ? ((ordered) obj).getorder() : null);
}
//org.springframework.core.annotation.annotationawareordercomparator#findorder
@override
@nullable
protected integer findorder(object obj) {
//调用父类ordered接口中findorder方法
integer order = super.findorder(obj);
//有排序值则直接返回
if (order != null) {
return order;
}
//如果为空 说明实例没有实现ordered接口 则取类上@order注解上获取排序值
return findorderfromannotation(obj);
}
//org.springframework.core.annotation.annotationawareordercomparator#findorderfromannotation
@nullable
private integer findorderfromannotation(object obj) {
annotatedelement element = (obj instanceof annotatedelement ? (annotatedelement) obj : obj.getclass());
mergedannotations annotations = mergedannotations.from(element, searchstrategy.type_hierarchy);
//获取@order注解中的排序值 没有返回null
integer order = orderutils.getorderfromannotations(element, annotations);
if (order == null && obj instanceof decoratingproxy) {
return findorderfromannotation(((decoratingproxy) obj).getdecoratedclass());
}
return order;
}
3.3 、小结
下面将没有实现priorityordered接口,也没实现ordered接口,也没有加@order注解的类实例叫做 三无实例
ordercomparator类实现的功能:根据priorityordered和ordered接口中的排序值进行排序。总结一哈大概有以下情况:
- priorityordered实例 和 非priorityordered实例,priorityordered实例放前面
- priorityordered实例 和 priorityordered实例,根据getorder接口方法得到排序值比较
- ordered实例 和 ordered实例,根据getorder接口方法得到排序值比较
- 三无实例 和 三无实例,三无实例排序值为integer最大值,所以两个比较顺序不变
- ordered实例 和 三无实例,三无实例排序值为integer最大值,所有getorder接口方法得到排序值和integer最大值比较
annotationawareordercomparator类实现的功能:annotationawareordercomparator类是继承ordercomparator类的,所以在上面ordercomparator类功能的基础上,扩展了如果没有实现priorityordered和ordered接口的情况,从@order注解中获取排序值。
总结一哈大概有以下情况:
- priorityordered实例 和 非priorityordered实例,priorityordered实例放前面
- priorityordered实例 和 priorityordered实例,根据getorder方法得到排序值比较
- ordered实例 和 ordered实例,根据getorder方法得到排序值比较
- @order实例 和 @order实例, 根据@order中的排序值比较
- 三无实例 和 三无实例,三无实例排序值为integer最大值,所以两个比较顺序不变
- ordered实例 和 三无实例,三无实例排序值为integer最大值,所有getorder接口方法得到排序值和integer最大值比较
- ordered实例 和 @order实例,根据getorder方法得到排序值和@order中的排序值比较
- @order实例 和 三无实例,三无实例排序值为integer最大值,所有@order中的排序值和integer最大值比较
关于一个实现了priorityordered接口、ordered接口、加了@order注解的类中取排序值的优先级:
通过源码可知,如果实现了priorityordered接口,那么该类实例只能和同样实现了priorityordered接口比较才是通过排序值进行比较的,不然和非实现priorityordered接口的类实例比较,实现了priorityordered接口直接拍前面(不会管排序值大小)。
如果不满足上面,就会先从ordered接口中取排序值,没有实现ordered接口的话,就会从@order注解获取排序值,如果没有加@order注解,排序值默认为integer最大值。
二、@autowired能注入的集合类型及集合中顺序
1、数组
看过源码可知是根据annotationawareordercomparator外部比较器进行排序的,所以支持priorityordered接口 、ordered接口、@order排序
2、collection及其子类且必须为接口
看过源码源码可知只有当为list及其子接口时才会进行排序,是根据annotationawareordercomparator比较器进行排序,所以支持priorityordered接口 、ordered接口、@order排序
那么如果注入set集合要排序怎么办呢,我们阔以注入到sortedset集合中,在把要注入的实例类型实现comparable接口实现自定义排序
3、只能是map,不能是其子类
看过源码可知,map是不能进行排序的,而且只能注入map集合中,不能是map子类。
key为实例在容器中的名称,value为该实例。
三、总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论