Spring中的Aware接口的本质

       Spring Aware接口允许你“卷入”(hook into)Spring框架的内部工作。通过Spring Aware接口,你可以访问Spring上下文或者Spring的Bean生命周期事件

       你的Spring bean可能需要访问框架中的对象,比如ApplicationContextBeanFactoryResourceLoader。为了能够访问这些对象,你的bean可以实现(implement)这些Spring框架的Aware接口。

       当一个bean继承了Aware接口,Spring框架会在IoC容器启动的时候通过回调方法将特定的框架对象注入给这个bean。具体注入哪个框架对象取决于你实现(implement)了哪个Aware接口。比如,如果你的bean实现了ApplicationContextAware接口,Spring框架会把ApplicationContext对象注入给这个bean。类似的Spring的Aware接口,还有BeanFactoryAwareBeanNameAware等。

       在bean的生命周期中(lifecycle),Spring框架在创建bean的各个步骤中,会调用一些Aware接口的方法,来“干预”bean的创建。

       定位到Spring源码的AbstractAutowireCapableBeanFactory类的doCreateBean方法,这个方法调用了createBeanInstance->determineConstructorsFromBeanPostProcessors->SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors方法,目的就是为了在实例化这个bean前(InstantiationAware的含义就是让你感知到实例化这个步骤),看看是否有可用的构造器。
在doCreateBean调用的populateBean(填充bean)方法里面调用了InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法,允许在bean属性被填充前再做点事情,如改变bean的状态。

       总之Spring在bean的生命周期的各个阶段都提供了丰富的Aware PostProcessor(你也可以自定义这些接口的实现类,在Spring的高级容器ApplicationContext启动的时候会发现你自定义的实现类,然后在合适的时候调用)来允许你“介入”bean的生命周期。

       Aware其实就是“感知”的意思,让你能够感知Spring的存在,并且可以自定义一些实现来“介入”Spring框架的工作过程。其实所有的Aware接口的子接口都是为创建bean、完善bean服务的。

参考文章:https://springframework.guru/using-spring-aware-interfaces/

你可能感兴趣的:(java,spring)