这篇文章我们来分析一下经过@Value注释的变量时如何注入属性值的。
@Value属性值的注入发生在调用populateBean
给实例化完成的bean填充属性之时。
遍历BeanPostProcessor
列表,当调用AutowiredAnnotationBeanPostProcesor
的postProcessPropertyValues
方法时:
1 | public PropertyValues postProcessPropertyValues( |
可以看到,首先调用findAutowiringMetadata
函数来找到需要注入的元数据,然后调用inject
方法来注入相应的属性值。
InjectMetadata.inject(Object target, String beanName, PropertyValues pvs)
在inject
方法中遍历InjectedElement
元素,调用AutowiredFieldElement.inject
方法:
- 调用
value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter)
解析表达式 - 调用
field.set(bean, value)
将解析的值设置到相应的字段中
DefaultListableBeanFactory.resolveDependency
该方法针对bean定义解析特定的依赖,它最终调用的是DefaultListableBeanFactory.doResolveDependency
方法:
- 调用
AutowireCandidateResolver.getSuggestedValue(descriptor)
获得@Value注释中的描述信息。 - 如果这个描述信息非null且是String类型,调用
resolveEmbeddedValue
来解析描述信息的值。默认情况下调用AbstractPropertyResolver.resolvePlaceholders
来解析这个表达式 - 根据需要转换的类型,将解析表达式获得的值转换成响应的类型