AbstractAutowireCapableBeanFactory类的doCreateBean方法是创建Bean的开始,我们可以将关键代码的调用过程使用如下伪代码表述出来

  1. createBeanInstance(beanName, mbd, args);//创建Bean实例化
  2. populateBean(beanName, mbd, instanceWrapper); // 给bean进行属性赋值
  3. initializeBean(beanName, exposedObject, mbd)
  4. {
  5. invokeAwareMethods(beanName,bean);
  6. applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
  7. invokeInitMethods(beanName, wrappedBean, mbd); // 执行自定义初始化
  8. applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
  9. }
  10. //scope
  11. registerDisposableBeanIfNecessary(beanName, bean, mbd);//销毁bean
  12. //至此,整个bean的初始化过程就结束了。

Bean生命周期具体过程如下:

  1. 实例化接口InstantiationAwareBeanPostProcessor :
    1. 调用者通过getBean(beanName) 请求某一个Bean
    2. 实例化Before:如果容器注册了 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor 接口,则在实例化Bean 之前,将调用 postProcessBeforeInstantiation()方法。根据配置情况调用Bean构造函数 或工厂方法实例化Bean
    3. 实例化After:如果容器注册了InstantiationAwareBeanPostProcessor 接口,那么在实例化Bean之后,调用该接口的postProcessAfterInstantiation()方法,可在这里对已经实例化的Bean 进行一些操作
  2. populateBean设置对象属性:InstantiationAwareBeanPostProcessor接口继续执行postProcessProperties/postProcessPropertyValues两个方法。
    1. 如果Bean配置了属性信息BeanDefinition那么容器在这一步着手将配置值设置到Bean 对应的属性中去。postProcessPropertyValues已经废弃,推荐使用postProcessProperties方法
    2. @Autowired属性填充:Spring对属性Bean进行依赖注入;如果Bean的属性有使用@Autowired注入的属性,则会进行属性填充。前提是要保证属性实例已经存在于Spring容器当中
  3. 初始化接口BeanPostProcessor
    1. invokeAwareMethod方法:使用了Spring Aware 你的Bean将会和Spring框架耦合,Spring Aware 的目的是为了让Bean获取Spring容器的服务。
      1. 如果Bean 实现了 BeanNameAware 接口 则将调用 setBeanName 接口方法,将配置文件中该Bean 的对应名称设置到Bean 中去
      2. 实现BeanClassLoaderAware接口,调用setBeanClassLoader方法
      3. 如果Bean 实现了 BeanFactoryAware 接口 则将调用 setBeanFactory 接口方法,将BeanFactory容器实例设置到Bean 中去,将BeanFactory实例传进来;
      4. 如果bean实现了ApplicationContextAware接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到bean中;
      5. 其他的Aware:
        1. MessageSourceAware:获得message source,这也可以获得文本信息
        2. applicationEventPulisherAware:应用事件发布器,可以发布事件,
        3. ResourceLoaderAware: 获得资源加载器,可以获得外部资源文件的内容;
    2. 初始化Before:如果BeanFactory 装配了 org.springframework.beans.factory.config.BeanPostProcessor 后处理 ,则将调用postProcessBeforeInitialization(Object bean, String beanName)方法 对Bean 进行加工操作,其中,入参Bean 是当前操作的Bean,而BeanName 是当前 Bean 的 配置名,返回对象加工后的Bean。
    3. 如果Bean实现了 InitializingBean 接口,则将调用接口的afterPropertiesSet 方法。类似的如果在applicationContext 配置文件中通过init-method属性指定了初始化方法,则将执行指定的初始化方法
    4. 初始化After:如果BeanFactory 装配了 org.springframework.beans.factory.config.BeanPostProcessor 后处理 ,则将调用postProcessAfterInitialization(Object bean, String beanName)方法 这个方法在此时调用,容器再次获得了对Bean 的加工机会。此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
  4. @Scope:如果在 中指定了作用范围
    1. scope = “prototype” 则将Bean返回给调用者, 由调用者管理Bean 的生命周期,此时Bean是多实例的,多实例Bean在使用getBean获取的时候才创建对象
    2. 如果 scope = “singleton” ,则将Bean放入 IOC容器的缓存池中,由Spring管理Bean的生命周期,此时Bean都是单实例的,对于单实例Bean对象来说,在Spring容器创建完成后就会对单实例Bean进行实例化
  5. DisposableBean销毁接口:若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。
    1. 同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用;

      createBeanInstance

      首先是实例化Bean,也就是在堆中开辟一块内存空间给这个对象,createBeanInstance方法里面逻辑大概就是采用反射生成实例对象,进行到这里表示对象还并未进行属性的填充,也就是@Autowired注解的属性还未得到注入
      实例化与属性填充、初始化、@Scope、销毁 - 图1

      populateBean

      第二步填充Bean属性populateBean(beanName,mbd,instanceWrapper)
      实例化与属性填充、初始化、@Scope、销毁 - 图2

      initializeBean

      @Scope

      销毁Bean


      将上述过程总结为流程图如下:
      实例化与属性填充、初始化、@Scope、销毁 - 图3