Spring属性填充的过程

87 阅读1分钟
  1. 创建对象后开始属性填充
  2. 通过对象的BeanDefinition获取该对象的属性集合propertyValues
  3. 遍历propertyValues中的每一个propertyValue,获取属性类型和属性值
  4. 判断是否存在对象依赖关系
  5. 如果该对象依赖于其他对象,递归取出其他对象
  6. 属性赋值

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);
    }
}