BeanDefinition生成

Spring在启动时,需要先扫描到需要创建的类,将这些类解析为Bean定义(Bean定义了Bean的一些创建信息,如是否单例,是否懒加载,beanClass等),生成好的Bean定义存储在beanDefinitionMap中,此时的BeanClass还是类名字符串(如: "com.heoller.entity.User"),没有加载成Class对象。

// org.springframework.beans.factory.support.DefaultListableBeanFactory
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

RootBeanDefinition生成

/*
 * 合并bean定义, 生成RootBeanDefinition。
 * <bean id="commonBean" abstract="true" scope="prototype" />
 * <!-- 此时user的scope属性将会是prototype -->
 * <bean id="user" class="com.heoller.entity.User" parent="commonBean" />
 */
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

加载beanClass

// 加载beanClass并返回Class对象
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);

执行实例化前的BeanPostProcessors

Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
// 实例化前执行InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
  for (BeanPostProcessor bp : getBeanPostProcessors()) {
    if (bp instanceof InstantiationAwareBeanPostProcessor) {
      InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
      Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
      if (result != null) {
        return result;
      }
    }
  }
  return null;
}

选择构造方法

实例化

根据构造方法反射创建实例

RootBeanDefinition后置处理器

可以通过这个后置处理器完成BeanDefinition的修改,比如: 修改bean的初始化方法、propertyValues等,作用于Bean的初始化阶段。

// org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition

填充属性

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

执行Aware

private void invokeAwareMethods(String beanName, Object bean) {
  if (bean instanceof Aware) {
    if (bean instanceof BeanNameAware) {
      ((BeanNameAware) bean).setBeanName(beanName);
    }
    if (bean instanceof BeanClassLoaderAware) {
      ClassLoader bcl = getBeanClassLoader();
      if (bcl != null) {
        ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
      }
    }
    if (bean instanceof BeanFactoryAware) {
      ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
    }
  }
}

执行初始化前的BeanPostProcessors

public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
    throws BeansException {

  Object result = existingBean;
  for (BeanPostProcessor processor : getBeanPostProcessors()) {
    // CommonAnnotationBeanPostProcessor会处理@PostConstruct注解方法
    // ApplicationContextAwareProcessor会执行各种Aware方法
    Object current = processor.postProcessBeforeInitialization(result, beanName);
    if (current == null) {
      return result;
    }
    result = current;
  }
  return result;
}

执行初始化方法

protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)
  throws Throwable {

  boolean isInitializingBean = (bean instanceof InitializingBean);
  if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
    if (logger.isTraceEnabled()) {
      logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
    }
    if (System.getSecurityManager() != null) {
      try {
        AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
          ((InitializingBean) bean).afterPropertiesSet();
          return null;
        }, getAccessControlContext());
      }
      catch (PrivilegedActionException pae) {
        throw pae.getException();
      }
    }
    else {
      ((InitializingBean) bean).afterPropertiesSet();
    }
  }

  if (mbd != null && bean.getClass() != NullBean.class) {
    String initMethodName = mbd.getInitMethodName();
    if (StringUtils.hasLength(initMethodName) &&
        !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
        !mbd.isExternallyManagedInitMethod(initMethodName)) {
      invokeCustomInitMethod(beanName, bean, mbd);
    }
  }
}

执行初始化后的BeanPostProcessors

public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
      throws BeansException {

  Object result = existingBean;
  for (BeanPostProcessor processor : getBeanPostProcessors()) {
    Object current = processor.postProcessAfterInitialization(result, beanName);
    if (current == null) {
      return result;
    }
    result = current;
  }
  return result;
}