springboot aware是什么?
aware其实并非是springboot添加的功能,而是spring框架的重要部分;
Aware本身是一个接口,如图:
他的实现类有很多,比如我们最常见的:ApplicationContextAware
springboot/spring的 aware是如何被调用的?
一句话表述,是在 BeanPostProcessor 的 postProcessBeforeInitialization 方法种调用的,换句话来描述,每个Aware都依赖着BeanPostProcessor来调用它;
详细点讨论的话,叫要回到我们所熟知的,十分出名的 refresh 方法了。
- refresh 方法会调用方法 finishBeanFactoryInitialization(beanFactory) 来实例化所有的非懒加载的单例bean;
- 调用 DefaultListableBeanFactory 的 preInstantiateSingletons 方法;
- DefaultListableBeanFactory中会调用同类中的getBean方法,之后会调用到 AbstractBeanFactory的 doGetBean方法(很长的一个方法,真正做事情的);
- 调用 DefaultListableBeanFactory 的 getSingleton方法
- 调用AbstractAutowireCapableBeanFactory的 doCreateBean -> initializeBean方法
- initializeBean方法有一个关键的步骤:applyBeanPostProcessorsBeforeInitialization。这个方法会遍历容器中的BeanPostProcessor,并执行processor.postProcessBeforeInitialization。例如ApplicationContextAware就依赖着 ApplicationContextAwareProcessor,其postProcessBeforeInitialization方法会判断bean的类型,如果满足特定类型(其实不仅仅包括ApplicationContextAware),会执行容器上下文的设置;