Spring源码学习笔记(四)、prepareBeanFactory

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路Spring源码学习笔记(四)、prepareBeanFactory,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、方法功能概述

// Prepare the bean factory for use in this context.
// 准备bean工厂,初始化bean工厂,给bean工厂设置属性值
prepareBeanFactory(beanFactory);

准备bean工厂,初始化bean工厂,给bean工厂设置属性值,主要包含如下的操作:

  • 设置BeanFactory的类加载器

  • 设置BeanExpressionResolver

  • 添加ResourceEditorRegistrar

  • 添加ApplicationContextAwareProcessor

  • 忽略一些依赖接口

  • 设置几个自动装配的特殊规则

  • 添加ApplicationListenerDetector

  • 增加对AspectJ的支持

  • 将相关环境变量及属性以单例模式注册

二、整体代码展示

//AbstractApplicationContext
/**
 * Configure the factory's standard context characteristics,
 * such as the context's ClassLoader and post-processors.
 * @param beanFactory the BeanFactory to configure
 */
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    //设置beanFactory的classLoader为当前context的classLoader
    beanFactory.setBeanClassLoader(getClassLoader());
	//设置beanFactory的表达式语言处理器,Spring3增加了表达式语言的支持,SPEL语言。
    //默认可以使用#{bean.xxx}的形式来调用相关属性值。
    beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
	//为beanFactory增加了一个默认的propertyEditor,这个主要是对bean的属性等设置管理的一个工具
    beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

    //添加BeanPostProcessor
    //ApplicationContextAwareProcessor实现了BeanPostProcessor接口,在bean实例化的时候会被调用postProcessBeforeInitialization
    //postProcessBeforeInitialization方法中调用了invokeAwareInterfaces。从invokeAwareInterfaces方法中,我们可以看出来,实现这些Aware接口的bean在被初始化之后,可以取得一些对应的资源。
    beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
    //Spring将ApplicationContextAwareProcessor注册后,在invokeAwareInterfaces方法中间调用的Aware类已经不是普通的bean了,
    //如ResourceLoaderAware,ApplicationEventPublisherAware等,需要在Spring做bean的依赖注入的时候忽略它们。
	beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
    beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
    beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
    beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
    beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
    beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

    //设置了几个自动装配的特殊规则  
    //当注册了依赖解析后,例如当注册了对BeanFactory.class的解析后,当bean的属性注入的时候
	//一旦检测到属性为BeanFactory类型便会将beanFactory的实例注入进去。
    beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
    beanFactory.registerResolvableDependency(ResourceLoader.class, this);
    beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
    beanFactory.registerResolvableDependency(ApplicationContext.class, this);

	//看ApplicationListenerDetector源码我们会知道其作用是找到ApplicationListener的子类
	//并加入到ApplicationListener中
    beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

    //增加对AspectJ的支持,也是就用于AOP静态代理相关的处理
    if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
        beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
        beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    }

    //将相关环境变量及属性以单例模式注册,environment,systemProperties,systemEnvironment
    if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
        //如果没有定义"environment"这个bean,那么Spring会"手动"注册一个
        beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
    }
    if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
        //如果没有定义"systemProperties"这个bean,那么Spring会"手动"注册一个
        beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
    }
    if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
        //如果没有定义"systemEnvironment"这个bean,那么Spring会"手动"注册一个
        beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154518.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!