• 【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);
            }
        }
    
    }
  • 相关阅读:
    MyBatis框架浅析之 缓存
    MyBatis框架浅析之 Mapper.xml 映射文件
    MyBatis框架浅析之 XML配置文件
    MySQL安装
    C语言内存分配
    二叉树性质
    pycharm使用anaconda的python环境
    linux删除文件夹、文件名字转码、java转码、json字符报错、查看当前系统编码、传代码至git
    java 性能优化
    java 建maplist放case center合并
  • 原文地址:https://www.cnblogs.com/mufeng07/p/14129456.html
Copyright © 2020-2023  润新知