美文网首页
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 AOP源码

    结合 Spring 后置处理器源码 和 Spring Aware源码 ,再来看下 Spring AOP 的源码。 ...

  • Spring Aware源码

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

  • Spring Aware容器感知技术

    ​ Spring Aware是什么 Spring提供Aware接口能让Bean感知Spring容器的存在,即让Be...

  • spring的aware们

    Aware是什么 spring框架提供了多个*Aware接口,用于辅助Spring Bean编程访问Spring容...

  • 由Aware引发的思考

    之前文章讲过,我们学习源码的很大原因是学习一些奇技淫巧。Aware就是其中之一。 spring中Aware是个接口...

  • spring中Aware后缀

    aware: 意识到的;知道的; spring中带有Aware后缀的接口主要是和bean有关,实现了Aware后...

  • spring源码学习之Aware分析

    还记的我们在#CreateBean(...)方法中其中有一个过程是初始化bean的过程,在初始化的方法中我们其中有...

  • Spring高级应用 之Aware类

    1.Aware类为Bean感知Spring容器的存在提供支持,实现Aware类便可利用利用Spring容器中的各种...

  • SpringIoc之Aware

    Aware 概述 Aware是Spring提供的一个标记超接口,指示bean有资格通过回调样式的方法由Spring...

  • Spring 源码(十)Spring Aware自动装配原理

    Spring Aware自动装配有两种实现方式: 在初始化Bean的initializeBean方法中执行invo...

网友评论

      本文标题:Spring Aware源码

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