Spring Aware源码

通过实现 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 实现类。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本来是准备看一看Spring源码的。然后在知乎上看到来一个帖子,说有一群**自己连Spring官方文档都没有完全读...
    此鱼不得水阅读 11,823评论 4 21
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan阅读 9,760评论 2 7
  • Spring框架官网下载教程:https://blog.csdn.net/saszyl/article/detai...
    惜小八阅读 3,674评论 0 1
  • 参考W3C Spring教程 Spring致力于J2EE应用的各种解决方案,而不仅仅专注于某一层解决方案。可以说S...
    王侦阅读 4,871评论 0 6
  • 一、html思想 (一)经过几天的学习认为HTML重要的还是学会分析框架模块,可以用一些专用标签例如 、 、 等有...
    赵学习阅读 3,214评论 0 0