• 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 实现类。
  • 相关阅读:
    JS浮点数的加减乘除运算
    鼓励心里的阳光
    mysql创建新用户并分配数据库权限
    CentOS下的Memcache安装步骤(Linux+Nginx+PHP+Memcached)
    Python发送邮件
    SQL操作语句
    Mysql数据库操作语句
    Cookie,Session的区别
    Jmeter性能测试-分布式压力测试
    性能测试指标
  • 原文地址:https://www.cnblogs.com/bigshark/p/11312801.html
Copyright © 2020-2023  润新知