Spring 依赖注入处理的代码入口在 DefaultListableBeanFactory#resolveDependency() 方法。
该方法第一个参数 DependencyDescriptor descriptor 继承自 InjectionPoint,是这次依赖注入的描述,类里的信息说明如下:
//依赖所在的声明类
private final Class<?> declaringClass;
//如果依赖是成员方法的某个参数,则这里记录该成员方法的名称
private String methodName;
//如果包装的是成员方法的某个参数,则这里记录该参数的类型
private Class<?>[] parameterTypes;
//如果包装的是成员方法的某个参数,则这里记录该参数在该函数参数列表中的索引
private int parameterIndex;
//成员属性的名称
private String fieldName;
//是否必要依赖
private final boolean required;
//是否需要饥饿加载
private final boolean eager;
//嵌套级别
private int nestingLevel = 1;
//依赖的包含者类,通常和声明类是同一个
private Class<?> containingClass;
结合测试代码看一下:
User 类和 Friend 类,User 中注入 Friend 对象
@Component
public class User {
@Autowired
private Friend friend;
@Override
public String toString() {
return "User{" +
"friend=" + friend +
'}';
}
}
@Component
public class Friend {
private String name = "friend";
@Override
public String toString() {
return "Friend{" +
"name='" + name + '\'' +
'}';
}
}
测试代码
/**
* 测试 Bean 依赖注入的处理,进行源码调试
*
* @author ConstXiong
*/
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("constxiong");
User user = context.getBean(User.class);
System.out.println(user);
}
}
DefaultListableBeanFactory#resolveDependency() 方法的逻辑
ConstXiong 备案号:苏ICP备16009629号-3