前言
在阅读 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定义,并注意到有两个候选者:primaryMyService和anotherMyService。因为primaryMyService标注了@Primary注解,所以Spring会选择primaryMyService作为满足MyComponent构造器依赖的对象。
这个过程中,DependencyDescriptor就起到了关键作用,它帮助Spring框架理解并解析出正确、合适的依赖项。