【spring源码分析】二、Aware

2.Aware

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);
        }
    }

}

 

posted @ 2020-12-13 18:16  mufeng07  阅读(132)  评论(0编辑  收藏  举报