Spring Bean的生命周期

ApplicationContext容器bean的生命周期事件

  1. refresh() -> invokeBeanFactoryPostProcessors()

    查找所有实现了 BeanFactoryPostProcessor 接口的 bean,调用 postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 方法.

    由于在此之前已经通过 obtainFreshBeanFactory() 创建了 beanFactory,加载了所有 beanDefinition,所以此处可以通过 BeanFactory 获取 BeanDefinition,对 BeanDefinition 的属性 propertyValues 进行操作.对配置信息进行加工处理,仅在应用上下文初始化时调用一次.

    Spring 框架提供了多个工厂后处理器: CustomEditorConfigurer 、 PopertyPlaceholderConfigurer 等.

    BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

  2. registerBeanPostProcessors(beanFactory);
    注册 BeanPostProcessor 的实现类.这里只是注册,真正的调用是在 getBean() 的时候.

  3. 实例化前的处理器
    InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()

       refresh() 
    -> finishBeanFactoryInitialization(beanFactory) 初始化所有非懒加载的 singleton beans.
    -> beanFactory.preInstantiateSingletons() 
    -> getBean(beanName) 
    -> doCreateBean() 
    -> getSingleton()
    -> getObject()
    -> createBean()
    -> resolveBeforeInstantiation()
    -> applyBeanPostProcessorsBeforeInstantiation()
    -> postProcessBeforeInstantiation()
    
  4. 实例化 bean,调用构造方法

       refresh() 
    -> finishBeanFactoryInitialization(beanFactory) 初始化所有非懒加载的 singleton beans.
    -> beanFactory.preInstantiateSingletons() 
    -> getBean(beanName) 
    -> doCreateBean() 
    -> getSingleton()
    -> return createBean(beanName, mbd, args);
    -> Object beanInstance = doCreateBean(beanName, mbd, args);
    -> instanceWrapper = createBeanInstance(beanName, mbd, args);
       // 据指定bean使用对应的策略创建新的实例,如:工厂方法、构造函数自动注入、简单初始化
    -> instantiateBean(beanName, mbd);使用默认构造函数实例化bean
    -> getInstantiationStrategy().instantiate(mbd, beanName, parent);
    -> BeanUtils.instantiateClass(constructorToUse);// 利用构造方法进行实例化
    
  5. 调用各个 setter 方法设置属性

       refresh() 
    -> finishBeanFactoryInitialization(beanFactory) // 初始化所有非懒加载的 singleton beans.
    -> beanFactory.preInstantiateSingletons() 
    -> getBean(beanName) 
    -> doCreateBean() 
    -> getSingleton()
    -> return createBean(beanName, mbd, args);
    -> Object beanInstance = doCreateBean(beanName, mbd, args);
    -> populateBean(beanName, mbd, instanceWrapper);
       // 对 bean 进行属性装配.将各个属性值注入.其中可能存在依赖于其他 bean 的属性,则会递归初始化调用各个 set() 方法设置属性
    

    到这一步已经创建完成了 JavaBean,后续操作完成 Spring Bean 的处理.

  6. Aware 接口,init()方法
    此时 bean 已经创建完成,setter 方法也调用过了,在这里能获取到 beanName 和 bean.做一些初始化操作.
    调用 BeanNameAware,BeanFactoryAware.
    BeanPostProcessor.postProcessBeforeInitialization(),
    InitializingBean.afterPropertiesSet(),init-method,
    BeanPostProcessor.postProcessAfterInitialization()

       refresh() 
    -> finishBeanFactoryInitialization(beanFactory) 初始化所有非懒加载的 singleton beans.
    -> beanFactory.preInstantiateSingletons() 
    -> getBean(beanName) 
    -> doCreateBean() 
    -> initializeBean(beanName, exposedObject, mbd);
    

    这一步会 调用初始化方法.

    比如 Aware 接口的方法, BeanPostProcessor, init-method, InitializingBean 等.

    1. 对特殊的 bean 处理 : Aware、BeanClassLoaderAware、BeanFactoryAware

    invokeAwareMethods(beanName, bean);

    会依次调用
    BeanNameAware.setBeanName(beanName) 能通过该方法获取到 beanName

    (BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader()

    ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this); 能通过该方法获取到 beanFactory

    1. 获取所有的 BeanPostProcessor, 依次调用 postProcessBeforeInitialization()方法.

    这个时候 bean 构造方法调过了,setter 方法调过了,Aware接口的方法调过了.在调用 init 方法之前

    BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName)调用,可以对bean属性再做修改

    这里有一个 ApplicationContextAwareProcessor, 实现了 ApplicationContextAware 接口的类会调用
    ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext)方法

    1. 处理 bean中定义的 InitializingBean.afterPropertiesSet() 方法 和 init-method 方法,
      在此之前所有属性都处理完了.
    -> doCreateBean() 
    -> initializeBean(beanName, exposedObject, mbd);
    -> invokeInitMethods(beanName, wrappedBean, mbd);
    ->
    ((InitializingBean) bean).afterPropertiesSet();// 调用 afterPropertiesSet()方法
    invokeCustomInitMethod(beanName, bean, mbd);// 调用自定义的 init-method 方法
    
    1. BeanPostProcessor.postProcessAfterInitialization()
      init()方法调用之后.
      wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
  7. 关闭.
    6.1 实现了 DisposableBean 接口,调用 ((DisposableBean) bean).destroy() 方法

    6.2 调用 destory-method 指定的方法

    6.3 调用 实现了 AutoCloseable 接口的 close() 方法

你可能感兴趣的:(Spring)