Spring 依赖注入的处理过程与 DependencyDescriptor 的说明

2021-02-04

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