- 创建对象后开始属性填充
- 通过对象的BeanDefinition获取该对象的属性集合propertyValues
- 遍历propertyValues中的每一个propertyValue,获取属性类型和属性值
- 判断是否存在对象依赖关系
- 如果该对象依赖于其他对象,递归取出其他对象
- 属性赋值
AbstractAutowireCapableBeanFactory#applyPropertyValues
@Override
protected Object createBean(String beanName, BeanDefinition beanDefinition, Object[] args) throws BeansException {
Object bean = null;
try {
bean = createBeanInstance(beanDefinition, beanName, args);
// 给 Bean 填充属性
applyPropertyValues(beanName, bean, beanDefinition);
// 执行 Bean 的初始化方法和 BeanPostProcessor 的前置和后置处理方法
bean = initializeBean(beanName, bean, beanDefinition);
} catch (Exception e) {
throw new BeansException("Instantiation of bean failed", e);
}
// 注册实现了 DisposableBean 接口的Bean对象
registerDisposableBeanIfNecessary(beanName, bean, beanDefinition);
// 判断 单例 OR 原型
if (beanDefinition.isSingleton()) {
addSingleton(beanName, bean);
}
return bean;
}
/**
* Bean 属性填充
*/
protected void applyPropertyValues(String beanName, Object bean, BeanDefinition beanDefinition) throws BeansException {
try {
//通过对象的BeanDefinition获取该对象的属性集合propertyValues
PropertyValues propertyValues = beanDefinition.getPropertyValues();
//遍历propertyValues中的每一个propertyValue,获取属性类型和属性值
for (PropertyValue propertyValue : propertyValues.getPropertyValues()) {
String name = propertyValue.getName();
Object value = propertyValue.getValue();
//判断是否存在对象依赖关系
if (value instanceof BeanReference) {
// A 依赖 B,获取 B 的实例化
BeanReference beanReference = (BeanReference) value;
value = getBean(beanReference.getBeanName());
}
// 属性填充
BeanUtil.setFieldValue(bean, name, value);
}
} catch (Exception e) {
throw new BeansException("Error setting property values:" + beanName);
}
}