Spring在单值注入时如何按类型查找匹配的Bean

技术Spring在单值注入时如何按类型查找匹配的BeanSpring在单值注入时如何按类型查找匹配的Bean,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。引

春天在单值注入时如何按类型查找匹配的比恩,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

引言

我经常写如下代码:

@ autowiredprivateserviceservice;不知你是否也好奇春天,是如何找到服务类型的豆的呢?,我们就聊聊这个-单值注入时如何按类型查找匹配的Bean.

单值注入时如何按类型查找匹配的Bean

很简单,核心就3步。

1.找到所有与类型匹配的bean,如果只有一个直接返回。

春季在DefaultListableBeanFactory.findAutowireCandidates方法中实现。其部分源码如下:

字符串[]念珠菌名称=

bean factoryutils。bean名称或类型包括在内

(这个,requiredType,true,descriptor。iseager());这个包含Inconcerts的bean名称sfortypeaincluding的作用就是,获取所需类型(服务)类型所有匹配的beanName(包含先祖豆工厂).

包含Inconcerts的bean名称sfortypeaincluding内部是如果实现的呢?我概括了下简要逻辑如下:

遍历所有的豆定义,获得所有的豆名。

针对所有的豆名,先尝试获取单例进行匹配,若未匹配上再以豆定义进行匹配。

匹配时,如果豆是FactoryBean,先尝试FactoryBean生产的实际豆进行匹配,若未匹配上再以FactoryBean进行匹配。

2.多个Bean匹配时,有首选,返回首选的bean。

DefaultListableBeanFactory.determinePrimaryCandidate实现了筛选首选Bean的逻辑,其中的核心方法是是主要,该方法是判断当前豆是否是首选豆的。源码如下:

protectedbooleanisPrimary(StringbeanName,objectbeainstance){ 0

if(包含BeanDefinition(BeanName)){ 0

returngetMergedLocalBeanDefinition(bean名称).是primary();

}

BeanFactoryParent=GetParentBeanFactory();

返回(parentinstanceofdefaultlistablebean工厂)((defaultlistablebean工厂)父级)。isPrimary(beanName,BeanInstance));

}getMergedLocalBeanDefinition(beanName).isPrimary()方法,对应AbstractBeanDefinition的primary属性,该属性被赋值的地方是在annotatedbeandedefinitionreader。doregisterbean方法中。有如下逻辑。

//省略甚多代码.

对于(类?extendsannotationqualifier :限定符){ 0

if(初级。类==限定符){ 0

abd.setPrimary(真);

}

//省略很多代码.看到这,我们可以得出一个结论:

被@初级注解的比恩,单值注入时会作为首选。

3.没有首选,按优先级选择,返回优选的Bean。

春季是如何确定豆的优先级的呢?

在DefaultListableBeanFactory.determineHighestPriorityCandidate中,实现按优先级选择Bean其中,获取豆的优先级的逻辑在获取优先级方法中,如下:

protectedintegertepriority(ObjectBeanInstance){ 0

ComparatorObjectcomparator=GetDependency comparator();

if(comparatorinstanceorder comparator){ 0

返回((订单比较器)比较器).getPriority(BeanInstance);

}

returnnull

}查看订单比较器的实现类注释高级比较器中的源码发现,获取优先级的逻辑实际在在OrderUtils.getPriority 中

publicationstatintegergetpriority(类?类型){ 0

if(priorityAnnotationType==null){ 0

returnnull

}

Objectcached=priorityCache.get(类型);

如果(缓存!=null){ 0

return(cachedinstanceofInteger?(整数)缓存d :为空);

}

annotation priority=annotation utils。查找注释(类型,priorityAnnotationType);

Integerresult=null

如果(优先!=null){ 0

结果=(整数)AnnotationUtils.getValue(优先级);

}

priorityCache.put(类型,(结果!=null?结果: not _ ANNOTED));

返回结果;

}在订单向上查找发现优先级注释类型的值为:

优先级注释类型=(类?extendsAnnotation)类utils。对于名称(' javax。注释。“优先级”,顺序实用程序。上课。getclass loader());被@优先级注解的类,其值越小,在单值注入时,越优先选择。

春天的源码非常多,仅有这3步当然是不行的,我准备了流程图,梳理了春天单值注入时查找匹配豆的流程。

单值注入时如何按类型查找匹配的Bean的流程图

Spring在单值注入时如何按类型查找匹配的Bean

看完上述内容,你们掌握春天在单值注入时如何按类型查找匹配的豆的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/51149.html

(0)

相关推荐

  • 如何理解UML设计模式

    技术如何理解UML设计模式这篇文章将为大家详细讲解有关如何理解UML设计模式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.UML1.1UML是什么一种创建程序模型的可

    攻略 2021年11月23日
  • 抹胸内衣,穿抹胸裙如何隐藏内衣带

    技术抹胸内衣,穿抹胸裙如何隐藏内衣带1抹胸内衣、露双肩抹胸上衣/裙装系列露双肩抹胸的衣服看起来恐怕只能佩戴无肩带文胸,可真真怕一不留神来个滑落走光。姑娘们,方法是有滴:取一条闲置的内衣肩带,在内衣下缘多绕一圈,妥妥解决!

    生活 2021年10月20日
  • 罗马数字0,在罗马数字中,零该怎么写

    技术罗马数字0,在罗马数字中,零该怎么写罗马数字起源于古罗马.一共有7个数字符:I,V,X,L,C,D,M
    相应的阿拉伯数字表示为:
    1,5,10,50,100,500,1000
    用罗马数字表示数时,如果几个相同的数字并

    生活 2021年10月26日
  • Windows Oracle 11G R2搭建方法是什么

    技术Windows Oracle 11G R2搭建方法是什么本篇内容主要讲解“Windows Oracle 11G R2搭建方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家

    攻略 2021年11月9日
  • 通州运河公园,通州有特色的文化旅游地有什么

    技术通州运河公园,通州有特色的文化旅游地有什么通州的特色文化旅游这几个景点可以参考:1.历史名桥:八里桥又名永通桥通州运河公园。建于明正统十一年(一四四六年),南北走向,长三十米,宽十六米,桥两侧有三十三块护栏雕饰、三十

    生活 2021年10月30日
  • VB.NET文件操作语法有哪些

    技术VB.NET文件操作语法有哪些这篇文章主要介绍VB.NET文件操作语法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.拷贝文件(FileCopy语句)格式:FileCopy(源文件名)

    攻略 2021年12月2日