SpringBean生命周期

67 阅读1分钟

实例化->属性赋值->初始化->销毁

AbstractAutowireCapableBeanFactory#doCreateBean

// 忽略了无关代码
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
      throws BeanCreationException {
    // Instantiate the bean.
    BeanWrapper instanceWrapper = null;
    if (instanceWrapper == null) {
       // 实例化!
       instanceWrapper = createBeanInstance(beanName, mbd, args);
    }

    // Initialize the bean instance.
    Object exposedObject = bean;
    try {
        // 属性赋值!
        populateBean(beanName, mbd, instanceWrapper);
        // 初始化!
        exposedObject = initializeBean(beanName, exposedObject, mbd);
    }
}

属性赋值执行之后,如果实现下述接口,则调用实现的方法(按先后顺序)
  • BeanNameAware#setBeanName()
  • BeanClassLoaderAware#setBeanClassLoader()
  • BeanFactoryAware#setBeanFactory(),将BeanFactory容器实例传入
  • ApplicationContextAware#setApplicationContext() ,将Bean所在应用上下文引用传入进来

所有的Aware方法都是在初始化阶段之前调用的,但是调用方式有所不同:
Bean××Aware是在代码中直接调用的
而ApplicationContext相关的Aware都是BeanPostProcessor#postProcessBeforeInitialization()实现的

  • BeanPostProcessor#postProcessBeforeInitialization()
  • InitializingBean#afterPropertiesSet()
  • 执行配置文件中init-method声明的初始化方法
  • BeanPostProcessor#postProcessAfterInitialization()



参考文档

www.cnblogs.com/javazhiyin/…

www.jianshu.com/p/1dec08d29…