扫码阅读
手机扫码阅读

Spring 中 @Primary 注解的原理是什么?

30 2024-11-27

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

查看原文:Spring 中 @Primary 注解的原理是什么?
文章来源:
江南一点雨
扫码关注公众号
文章摘要

1. 问题分析

在使用Spring框架时,可能会遇到类A注入类B的问题,尤其是在配置类中存在多个B实例的情况下。这会导致项目启动异常。解决这一问题的方法包括使用@Resource注解指定具体的Bean名称,使用@Qualifier注解指定要加载的Bean名称,以及在多个B对象中使用@Primary注解表示优先使用的对象。除此之外,还有其他解决方案涉及到@Qualifier注解的扩展用法。

2. 源码解析

文章基于@Autowired的工作原理展开,详细分析了doResolveDependency方法和determineAutowireCandidate方法。在doResolveDependency方法中,首先找到所有满足条件的Class,然后通过determineAutowireCandidate方法确定使用哪个Bean,特别是@Primary注解的处理。

2.1 doResolveDependency

doResolveDependency方法首先通过findAutowireCandidates方法寻找候选Class,如果@Qualifier注解未能解决问题,会继续通过determineAutowireCandidate方法判断使用哪个Bean。

2.2 determineAutowireCandidate

determineAutowireCandidate方法首先寻找带有@Primary注解的Bean作为首选,然后寻找带有@Priority注解的Bean以确定优先级,最后通过名称匹配来确定Bean。如果存在多个满足条件的BeanName,则会抛出异常。

2.2.1 determinePrimaryCandidate

determinePrimaryCandidate方法通过遍历候选BeanDefinition来确定是否有@Primary注解,如果有多个符合条件的BeanName,则抛出NoUniqueBeanDefinitionException异常。

2.2.2 determineHighestPriorityCandidate

要使用determineHighestPriorityCandidate方法,需要了解@Priority注解的用法。@Priority注解可以指定Bean的优先级,但只能加在类上面。该方法通过比较候选Bean的优先级,确定最高优先级的BeanName。

想要了解更多内容?

查看原文:Spring 中 @Primary 注解的原理是什么?
文章来源:
江南一点雨
扫码关注公众号