spring 源码解析番外篇之DependencyDescriptor

201 阅读2分钟

前言

在阅读 spring 源码的时候,会经常看到有DependencyDescriptor这个类,这个类是做什么的呢,下面一起来看看

描述

DependencyDescriptor在Spring框架中是一个关键类,它用于描述一个依赖注入点的相关信息。这个类包含了构造函数、方法参数或字段级别的注入需求的所有详细内容,以便于Spring容器正确解析和处理这些依赖。

  • Dependency Type:需要注入的类型的全限定名。
  • ResolvableType:更高级的类型信息,可以处理泛型、数组等复杂类型情况。
  • Field/Method/Constructor:关联的字段、方法或构造函数,这可以帮助确定依赖的具体来源。
  • Required Flag:指示该依赖是否必须存在。如果为true,当找不到合适的bean时会抛出异常;如果为false,则允许注入值为null。
  • Annotations:相关注解信息,如@Autowired、@Qualifier、@Value等,这些注解会影响依赖的查找和装配方式。
  • Generic Types and Arguments:对于带有泛型参数的注入点,存储了具体的泛型类型信息。

通过这样的描述符,Spring IoC容器可以根据这些属性来决定如何解决依赖关系,包括但不限于从Bean定义中查找匹配的bean实例、处理集合类型的注入以及进行自动类型转换等操作

例子

 @Configuration
 public class AppConfig {
 ​
     @Autowired
     private MyService myService;
 ​
     @Bean
     public MyComponent myComponent() {
         return new MyComponent(myService);
     }
 ​
     @Bean
     @Primary
     public MyService primaryMyService() {
         return new PrimaryMyServiceImpl();
     }
 ​
     @Bean
     public MyService anotherMyService() {
         return new AnotherMyServiceImpl();
     }
 }
 ​

在上述代码中,MyComponent类的构造函数需要注入一个MyService类型的实例。当Spring容器初始化myComponent()这个bean时,会创建一个DependencyDescriptor对象来描述对MyService的依赖需求。 这个DependencyDescriptor可能包含以下信息:

  • Dependency Type:类型为MyService
  • Required Flag:由于使用了@Autowired注解,默认情况下该依赖是必须的(required=true)
  • Annotations:无特定限定注解,如@Qualifier,这意味着Spring将寻找所有类型匹配的MyService实现
  • Associated Constructor Parameter:关联的构造函数参数

在解决这个依赖时,Spring容器会查找所有MyService类型的bean定义,并注意到有两个候选者:primaryMyServiceanotherMyService。因为primaryMyService标注了@Primary注解,所以Spring会选择primaryMyService作为满足MyComponent构造器依赖的对象。

这个过程中,DependencyDescriptor就起到了关键作用,它帮助Spring框架理解并解析出正确、合适的依赖项。