美文网首页
Spring Aware源码

Spring Aware源码

作者: O_Neal | 来源:发表于2019-08-07 01:31 被阅读0次

    通过实现 Aware 接口,可以在 Spring 启动时,调用接口定义的方法,将 Spring 底层的一些组件注入到自定义的 Bean 中。

    下面列出了几个 Spring 在 Aware 接口基础上,进行扩展的接口,分别会在创建 Bean 时直接执行,或者通过 BeanPostProcessor 间接执行:

    // 应用上下文 ApplicationContext
    ApplicationContextAware
    // 事件派发器
    ApplicationEventPublisherAware
    // 国际化
    MessageSourceAware
    // 资源加载器
    ResourceLoaderAware
    // 环境
    EnvironmentAware
    // 值解析器
    EmbeddedValueResolverAware
    
    BeanFactoryAware
    // Bean 名字
    BeanNameAware
    // 类加载器
    BeanClassLoaderAware
        
    // @Import 相关
    ImportAware
    

    直接执行

    Spring 后置处理器源码中,initializeBean() 调用的方法 invokeAwareMethods(),这个方法分别会直接执行 BeanNameAware、BeanClassLoaderAware、BeanFactoryAware,invokeAwareMethods()的源码如下:

    private void invokeAwareMethods(final String beanName, final Object bean) {
        if (bean instanceof Aware) {
            if (bean instanceof BeanNameAware) {
                ((BeanNameAware) bean).setBeanName(beanName);
            }
            if (bean instanceof BeanClassLoaderAware) {
                ClassLoader bcl = getBeanClassLoader();
                if (bcl != null) {
                    ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
                }
            }
            if (bean instanceof BeanFactoryAware) {
                ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
            }
        }
    }
    

    间接执行

    继续看 invokeAwareMethods() 调用的 applyBeanPostProcessorsBeforeInitialization(),它会遍历和执行容器中所有的 BeanPostProcessor,而 ApplicationContextAwareProcessor 也是 BeanPostProcessor 的一个实现类,它的主要源码如下:

    public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
        if (bean instanceof Aware) {
                if (bean instanceof EnvironmentAware) {
                    ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
                }
                if (bean instanceof EmbeddedValueResolverAware) {
                    ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
                }
                if (bean instanceof ResourceLoaderAware) {
                    ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
                }
                if (bean instanceof ApplicationEventPublisherAware) {
                    ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
                }
                if (bean instanceof MessageSourceAware) {
                    ((MessageSourceAware) bean).setMessageSource(this.applicationContext);
                }
                if (bean instanceof ApplicationContextAware) {
                    ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
                }
            }
        return bean;
    }
    

    ImportAware 见Spring AOP源码


    总结

    调用 refresh()-->finishBeanFactoryInitialization(beanFactory); 创建 Bean 时,会执行 Aware 的一些实现类。

    1. 通过直接执行的方式,执行 Aware 的一些基础接口方法。
    2. 通过 BeanPostProcessor 间接执行更高级的 Aware 实现类。

    相关文章

      网友评论

          本文标题:Spring Aware源码

          本文链接:https://www.haomeiwen.com/subject/ndqndctx.html