Spring源码深度解析系列(三):自动注入原理与循环依赖问题

前言

IOC容器的一个强大功能就是可以实现自动注入,本节就来看一下自动注入的原理,并且看一下循环依赖是如何解决的。

正文

最常用的自动注入是下面这种形式,一种是使用@Value注解给基本类型注入值,另一种是使用@Autowired注解给持有的对象自动注入想要的类型。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class JimmyController {
     

    @Value("Jimmy")
    private String name;

    @Autowired
    private JimmyService jimmyService;
}
import org.springframework.stereotype.Component;

@Component
public class JimmyService {
     
}

自动注入过程是在bean的生命周期中的populateBean()方法中完成的,我们来看一下。

首先,refresh()方法刷新容器,一路走到getBean()方法,这个方法便是产生bean实例的入口。
Spring源码深度解析系列(三):自动注入原理与循环依赖问题_第1张图片
然后一路追踪到populateBean()方法里面,我们在这个方法里面看到这样一段代码,这段代码是将很多InstantiationAwareBeanPostProcessor类型的后置处理器找出来,然后执行其postProcessProperties()方法。
Spring源码深度解析系列(三):自动注入原理与循环依赖问题_第2张图片
接下来进入这个方法看看

@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
     
	InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
	try {
     
		metadata.inject(bean, beanName, pvs);
	}
	catch (BeanCreationException ex) {
     
		throw ex;
	}
	catch (Throwable ex) {
     
		throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
	}
	return pvs;
}

我们可以看到,首先会读取到目标类中需要自动注入的所有属性,然后再一个一个进行注入。
Spring源码深度解析系列(三):自动注入原理与循环依赖问题_第3张图片
我们先来看String类型属性的注入,跟踪代码,会在inject()方法中执行如下代码,箭头指的方法就是真正处理依赖的方法。
Spring源码深度解析系列(三):自动注入原理与循环依赖问题_第4张图片
方法最终进入下面这个函数,会获取到依赖的类型和值,然后根据不同的类型做出不同的注入处理。将依赖的值返回给inject()方法,inject()方法再去反射给属性注入值。
Spring源码深度解析系列(三):自动注入原理与循环依赖问题_第5张图片
下面就是inject()方法中典型的使用反射给属性注入值。

if (value != null) {
     
	ReflectionUtils.makeAccessible(field);
	field.set(bean, value);
}

上面看了String类型的属性注入,接下来看类类型的属性注入。会获得Service类型,并且第一次并没有得到具体的value,代码继续跟踪。
Spring源码深度解析系列(三):自动注入原理与循环依赖问题_第6张图片
如果是类类型,就走到这个方法进行处理。
在这里插入图片描述
再进去这个方法,代码就很明显了,递归调用getBean()方法来实例化依赖的bean实例,并返回Object给inject()方法,反射注入属性。
Spring源码深度解析系列(三):自动注入原理与循环依赖问题_第7张图片
至此,IOC容器的自动注入源码的核心部分就讲完了,接下来我们来看一个知识点,就是循环依赖。

你可能感兴趣的:(spring源码,Spring源码,自动注入,原理,循环依赖)