Spring Aware源码

通过实现 Aware 接口,可以在 Spring 启动时,调用接口定义的方法,将 Spring 底层的一些组件注入到自定义的 Bean 中。 下面列出了几个 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 实现类。
  • 发表于 2019-08-07 11:20
  • 阅读 ( 158 )
  • 分类:网络文章

条评论

请先 登录 后评论
不写代码的码农
小编

篇文章

作家榜 »

  1. 小编 文章
返回顶部
部分文章转自于网络,若有侵权请联系我们删除