• 【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);
            }
        }
    
    }
  • 相关阅读:
    三维坐标变换习题
    1 Introduction and Roadmap
    快讯:2019 OOW 文档已提供下载
    过了35岁,90%以上DBA都在迷茫:未来要何去何从?
    深度学习入门笔记(五):神经网络的编程基础
    《算法图解》学习笔记(十):K 最近邻算法(附代码)
    LNMP环境搭建之php安装
    LNMP环境搭建之php安装
    LNMP环境搭建之php安装
    (PSO-BP)结合粒子群的神经网络算法以及matlab实现
  • 原文地址:https://www.cnblogs.com/mufeng07/p/14129456.html
Copyright © 2020-2023  润新知