1 | java复制代码protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { |
完成了按名字或按类型自动装配后,来到脑图里第三步,对解析完但还未设置的属性进行再处理。
这里需要关注AutowiredAnnotationBeanPostProcessor实现的postProcessProperties
方法
1 | java复制代码@Override |
首先会去尝试获取InjectionMetadata
对象,findAutowiringMetadata
方法之前在分析该类的postProcessMergedBeanDefinition
方法时,已经获取到了存储有该bean实例里被@Autowired或@Value标签修饰的属性列表的InjectionMetaData对象,并且将其已经放置到了缓存中。再次进入findAutowiringMetadata
在此次调用时,相关的InjectionMetadata
实例已经从缓存中获取到了,不需要再进到if里面去解析bean了,此时又回到postProcessProperties方法里,取到了InjectionMetadata实例之后直接对bean注入属性
1 | java复制代码metadata.inject(bean, beanName, pvs); |
1 | java复制代码public void inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable { |
该方法遍历每一个属性元素去调用元素的inject方法,进入inject发现又回到了AutowiredAnnotationBeanPostProcessor类里:
1 | java复制代码@Override |
在调用的过程中复用了其他类的装配能力,此时是给boyfriend装配上girlfriend实例,首先去缓存里看下之前是否解析过girlfriend,第一次执行会进入到else里,先用DependencyDescriptor
包装一下属性field
:
1 | java复制代码DependencyDescriptor desc = new DependencyDescriptor(field, this.required); |
之后给desc
注册上宿主的类名(Boyfriend):
1 | java复制代码desc.setContainingClass(bean.getClass()); |
之后会尝试获取之前容器初始化时注册上去的转换器TypeConverter
:
1 | java复制代码TypeConverter typeConverter = beanFactory.getTypeConverter(); |
converter用来做类型转换,默认获取spring自带的simpleTypeConverter用来处理简单类型的转换,之后执行
1 | java复制代码// 获取注入的值 |
进入resolveDependency方法里:
1 | java复制代码@Override |
在方法里会依据依赖描述符的不同类型进行不同的处理,但是最终都会到else里,真正起作用的是doResolveDependency方法
1 | java复制代码@Nullable |
首先尝试调用依赖描述符实例的resolveShortcut
方法,尝试从容器缓存里获取属性名对应的bean实例
1 | java复制代码@Nullable |
相对于注解的这种情况,并没有实现该方法。
之后尝试从依赖描述符实例里面去获取目标实例的属性
1 | java复制代码Class<?> type = descriptor.getDependencyType(); |
这里的目标实例是girlfriend,之后就会调用注解候选解析器的getSuggestedValue
方法尝试获取属性值,但是对于@Autowired修饰的属性来说,这一步无法获取到值
1 | java复制代码@Override |
该方法调用findValue
方法
1 | java复制代码@Nullable |
该方法主要是提取@Value修饰的属性值的
回到doResolveDependency
方法
本文转载自: 掘金