Aware.java是个没有定义任何方法的接口,拥有众多子接口,在spring源码中有多处都在使用这些子接口完成各种场景下的回调操作,当业务有需要时,我们只需创建类来实现相关接口,再声明为bean,就可以被spring容器主动回调;
public interface Aware {
}
常用的子接口:
1、ApplicationContextAware 能获取Application Context调用容器的服务
2、BeanNameAware 提供对BeanName进行操作
3、ApplicationEventPublisherAware 主要用于事件的发布
4、BeanClassLoadAware 相关的类加载器
5、BeanFactoryAware 声明BeanFactory的
spring源码分析子类接口使用场景
ApplicationContextAware在执行ApplicationContextAwareProcessor被调起(可参考BeanPostProcessor)
BeanNameAware、BeanClassLoadAware、BeanFactoryAware在哪被调起?
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
在创建Bean时,会调起org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)进行初始化
if (System.getSecurityManager() != null) { AccessController.doPrivileged(() -> { this.invokeAwareMethods(beanName, bean); return null; }, this.getAccessControlContext()); } else { this.invokeAwareMethods(beanName, bean); }
private void invokeAwareMethods(String beanName, Object bean) { if (bean instanceof Aware) { if (bean instanceof BeanNameAware) { //会调起bean重写的setBeanName方法 ((BeanNameAware)bean).setBeanName(beanName); } if (bean instanceof BeanClassLoaderAware) { ClassLoader bcl = this.getBeanClassLoader(); if (bcl != null) { //会调起bean重写的setBeanClassLoader方法 ((BeanClassLoaderAware)bean).setBeanClassLoader(bcl); } } if (bean instanceof BeanFactoryAware) { //会调起bean重写的setBeanFactory方法 ((BeanFactoryAware)bean).setBeanFactory(this); } } }