@Autowired注解源码

1.示例代码

@Component
public class A {  // A对象,其中将B对象作为属性进行注入

    @Autowired
    private B b;
}
@Component
public class B {

}

2.依赖注入过程

依赖注入流程图

涉及类:

AbstractAutowireCapableBeanFactory中doCreateBean-->创建对象;

AbstractAutowireCapableBeanFactory中populateBean-->创建对象过程中的属性填充操作;

AutowiredAnnotationBeanPostProcessor中postProcessProperties-->查询包含待注入对象的元数据对象,然后进行注入操作.涉及代码:

public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
​​​​​​​        // 查询带有注入依赖B信息的元数据A对象
   InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
   try {
        // 元数据A对象进行属性注入操作
      metadata.inject(bean, beanName, pvs);
   }
   // 省略异常捕获处理
   return pvs;
}

DefaultListableBeanFactory中doResolveDependency-->处理待注入依赖对象操作;

DefaultListableBeanFactory中findAutowireCandidates--> 查询待注入依赖对象信息;

 AbstractAutowireCapableBeanFactory中initializeBean-->初始化对象操作;

3.DefaultListableBeanFactory中findAutowireCandidates依赖查询源码解读

DependencyDescriptor.java,作用:待注入依赖对象的描述信息.
public class DependencyDescriptor extends InjectionPoint implements Serializable {

	@Nullable
	private String methodName;  // 方法名

	@Nullable
	private Class<?>[] parameterTypes;  // 参数类型

	private int parameterIndex;   // 参数索引

	@Nullable
	private String fieldName;   // 成员变量属性名

	private final boolean required;  // 是否是必填项

	private final boolean eager;   // 是否提前加载bean
    // 省略代码...................
}
DefaultListableBeanFactory中findAutowireCandidates,作用:查询对象中要进行注入依赖的bean实例信息,返回值是map集合={"待注入依赖beanName" :"待注入依赖的class对象"}
// 根据beanName查询当前对象中要进行注入的bean实例信息;参数依次为:当前对象的beanName,当前对象要进行注入依赖的class对象,当前对象要进行注入的依赖的描述信息
protected Map<String, Object> findAutowireCandidates(
			@Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) {
        // 根据要注入依赖的class对象获取注入依赖的beanName数组
		String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
				this, requiredType, true, descriptor.isEager());
		Map<String, Object> result = 
    // 根据待注入依赖的beanName个数进行创建集合,用于封装并返回
CollectionUtils.newLinkedHashMap(candidateNames.length);
    // 主要是判断beanName是否是spring自有的对象,如果是则添加到创建的集合中;resolvableDependencies中是存储spring自有的bean,非自定义的业务bean.
		for (Map.Entry<Class<?>, Object> classObjectEntry : this.resolvableDependencies.entrySet()) {
			Class<?> autowiringType = classObjectEntry.getKey();
			if (autowiringType.isAssignableFrom(requiredType)) {
				Object autowiringValue = classObjectEntry.getValue();
				autowiringValue = AutowireUtils.resolveAutowiringValue(autowiringValue, requiredType);
				if (requiredType.isInstance(autowiringValue)) {
					result.put(ObjectUtils.identityToString(autowiringValue), autowiringValue);
					break;
				}
			}
		}
// 此逻辑中进行自定义bean注入对象判断,即A注入B封装待注入依赖信息的逻辑.
		for (String candidate : candidateNames) {
// 对于不是自引用并且是待注入依赖进行组装返回信息
			if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, descriptor)) {
				addCandidateEntry(result, candidate, descriptor, requiredType);
			}
		}
		if (result.isEmpty()) {
			// 为空的逻辑本案例中不涉及,省略此部分代码......
		}
// 最终返回格式: result={"b" :"class com.chenghao.program.chenghaoprogram.study.B"}
		return result;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卖柴火的小伙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值