当前位置: 代码网 > it编程>编程语言>Java > Spring @Autowired注入集合时如何控制顺序

Spring @Autowired注入集合时如何控制顺序

2026年09月15日 Java 我要评论
一、@autowired注入集合顺序源码分析 spring 5.3.21、线程调用链2、注入主要逻辑//org.springframework.beans.factory.support.defaul

一、@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接口中的排序值进行排序。总结一哈大概有以下情况:

  1. priorityordered实例 和 非priorityordered实例,priorityordered实例放前面
  2. priorityordered实例 和 priorityordered实例,根据getorder接口方法得到排序值比较
  3. ordered实例 和 ordered实例,根据getorder接口方法得到排序值比较
  4. 三无实例 和 三无实例,三无实例排序值为integer最大值,所以两个比较顺序不变
  5. ordered实例 和 三无实例,三无实例排序值为integer最大值,所有getorder接口方法得到排序值和integer最大值比较

annotationawareordercomparator类实现的功能:annotationawareordercomparator类是继承ordercomparator类的,所以在上面ordercomparator类功能的基础上,扩展了如果没有实现priorityordered和ordered接口的情况,从@order注解中获取排序值。

总结一哈大概有以下情况:

  1. priorityordered实例 和 非priorityordered实例,priorityordered实例放前面
  2. priorityordered实例 和 priorityordered实例,根据getorder方法得到排序值比较
  3. ordered实例 和 ordered实例,根据getorder方法得到排序值比较
  4. @order实例 和 @order实例, 根据@order中的排序值比较
  5. 三无实例 和 三无实例,三无实例排序值为integer最大值,所以两个比较顺序不变
  6. ordered实例 和 三无实例,三无实例排序值为integer最大值,所有getorder接口方法得到排序值和integer最大值比较
  7. ordered实例 和 @order实例,根据getorder方法得到排序值和@order中的排序值比较
  8. @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为该实例。

三、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com