bean生命周期

1.扫描指定包路径下的class文件(获得每个Resource对象,生成MetadataReader对象)

2.生成BeanDefinition(MetadataReader对象生成一个ScannedGenericBeanDefinition对象)

3.合并BeanDefinition(如果某个BeanDefinition存在父BeanDefinition,那么则要进行合并)

4.加载类(利用BeanFactory所设置的类加载器来加载类,如果没有设置,则默认使用ClassUtils.getDefaultClassLoader()所返回的类加载器来加)

5.实例化前(InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(Class beanClass, String beanName))

如果这一步返回了bean,则执行InstantiationAwareBeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName),返回的bean不为null不再执行后续实例化流程

如:AbstractAutoProxyCreator.postProcessBeforeInstantiation() 遍历所有beanName,解析出被@Aspect标记的切面类和类中的所有Advice方法(通知)。

6.实例化(构造方法反射得到一个实例)

7.BeanDefinition的后置处理(MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName)

eg:AutowiredAnnotationBeanPostProcessor的 postProcessMergedBeanDefinition()找出注入点

8.属性填充(InstantiationAwareBeanPostProcessor.postProcessProperties(PropertyValues pvs, Object bean, String beanName))

eg: AutowiredAnnotationBeanPostProcessor的postProcessProperties()会遍历所找到的注入点依次进行注入

9.执行Aware

((BeanNameAware) bean).setBeanName(beanName);

((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);

((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);

10.初始化前

BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName

eg: ApplicationContextAwareProcessor.postProcessBeforeInitialization()中执行 ApplicationContextAware回调

InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName) 执行@PostConstruct注释的方法

11.初始化

((InitializingBean) bean).afterPropertiesSet();

执行BeanDefinition中指定的初始化方法


12.初始化后

BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName

eg:AbstractAutoProxyCreator.postProcessAfterInitialization() 进行AOP

//实例化非懒加载单例bean
DefaultListableBeanFactory.preInstantiateSingletons(){
    ...
    // 获取合并后的BeanDefinition
    RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
    ...
    // 创建Bean对象
    getBean(beanName);
    ...
}
              

                public Object getBean(String name) throws BeansException {
   return doGetBean(name, null, null, false);
}
              

                AbstractBeanFactory.doGetBean(
      String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
      throws BeansException {
          ...
          if (mbd.isSingleton()) {
           sharedInstance = getSingleton(beanName, () -> {
              try {
                 return createBean(beanName, mbd, args);
              }
              catch (BeansException ex) {
                 // Explicitly remove instance from singleton cache: It might have been put there
                 // eagerly by the creation process, to allow for circular reference resolution.
                 // Also remove any beans that received a temporary reference to the bean.
                 destroySingleton(beanName);
                 throw ex;
              }
           });
  	        beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
         }
          ...
          

              

                //创建bean
AbstractAutowireCapableBeanFactory.createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args){
    ...
    // 马上就要实例化Bean了,确保beanClass被加载了
    Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
    ...
    // 实例化前
    Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
    ...
    //实例化
    Object beanInstance = doCreateBean(beanName, mbdToUse, args);
    ...
    //BeanDefinition的后置处理
    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
    ...
    // 属性填充
    populateBean(beanName, mbd, instanceWrapper);
  // 初始化
    exposedObject = initializeBean(beanName, exposedObject, mbd);
    ...
}
              

                protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    ...
    //执行Aware回调
    invokeAwareMethods(beanName, bean);
    ...
    // 初始化前
    if (mbd == null || !mbd.isSynthetic()) {
       wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    }
    
    // 初始化
    try {
       invokeInitMethods(beanName, wrappedBean, mbd);
    }
    catch (Throwable ex) {
       throw new BeanCreationException(
             (mbd != null ? mbd.getResourceDescription() : null),
             beanName, "Invocation of init method failed", ex);
    }
    
    // 初始化后
    if (mbd == null || !mbd.isSynthetic()) {
       wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }
    ...
}