1.示例代码
@Component
public class A { // A对象,其中将B对象作为属性进行注入
@Autowired
private B b;
}
@Component
public class B {
}
2.依赖注入过程
依赖注入流程图
涉及类:
AbstractAutowireCapableBeanFactory中doCreateBean-->创建对象;
AbstractAutowireCapableBeanFactory中populateBean-->创建对象过程中的属性填充操作;
AutowiredAnnotationBeanPostProcessor中postProcessProperties-->查询包含待注入对象的元数据对象,然后进行注入操作.涉及代码:
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
// 查询带有注入依赖B信息的元数据A对象
InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
try {
// 元数据A对象进行属性注入操作
metadata.inject(bean, beanName, pvs);
}
// 省略异常捕获处理
return pvs;
}
DefaultListableBeanFactory中doResolveDependency-->处理待注入依赖对象操作;
DefaultListableBeanFactory中findAutowireCandidates--> 查询待注入依赖对象信息;
AbstractAutowireCapableBeanFactory中initializeBean-->初始化对象操作;
3.DefaultListableBeanFactory中findAutowireCandidates依赖查询源码解读
DependencyDescriptor.java,作用:待注入依赖对象的描述信息.
public class DependencyDescriptor extends InjectionPoint implements Serializable {
@Nullable
private String methodName; // 方法名
@Nullable
private Class<?>[] parameterTypes; // 参数类型
private int parameterIndex; // 参数索引
@Nullable
private String fieldName; // 成员变量属性名
private final boolean required; // 是否是必填项
private final boolean eager; // 是否提前加载bean
// 省略代码...................
}
DefaultListableBeanFactory中findAutowireCandidates,作用:查询对象中要进行注入依赖的bean实例信息,返回值是map集合={"待注入依赖beanName" :"待注入依赖的class对象"}
// 根据beanName查询当前对象中要进行注入的bean实例信息;参数依次为:当前对象的beanName,当前对象要进行注入依赖的class对象,当前对象要进行注入的依赖的描述信息
protected Map<String, Object> findAutowireCandidates(
@Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) {
// 根据要注入依赖的class对象获取注入依赖的beanName数组
String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
this, requiredType, true, descriptor.isEager());
Map<String, Object> result =
// 根据待注入依赖的beanName个数进行创建集合,用于封装并返回
CollectionUtils.newLinkedHashMap(candidateNames.length);
// 主要是判断beanName是否是spring自有的对象,如果是则添加到创建的集合中;resolvableDependencies中是存储spring自有的bean,非自定义的业务bean.
for (Map.Entry<Class<?>, Object> classObjectEntry : this.resolvableDependencies.entrySet()) {
Class<?> autowiringType = classObjectEntry.getKey();
if (autowiringType.isAssignableFrom(requiredType)) {
Object autowiringValue = classObjectEntry.getValue();
autowiringValue = AutowireUtils.resolveAutowiringValue(autowiringValue, requiredType);
if (requiredType.isInstance(autowiringValue)) {
result.put(ObjectUtils.identityToString(autowiringValue), autowiringValue);
break;
}
}
}
// 此逻辑中进行自定义bean注入对象判断,即A注入B封装待注入依赖信息的逻辑.
for (String candidate : candidateNames) {
// 对于不是自引用并且是待注入依赖进行组装返回信息
if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, descriptor)) {
addCandidateEntry(result, candidate, descriptor, requiredType);
}
}
if (result.isEmpty()) {
// 为空的逻辑本案例中不涉及,省略此部分代码......
}
// 最终返回格式: result={"b" :"class com.chenghao.program.chenghaoprogram.study.B"}
return result;
}