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

文章详细阐述了Spring在AbstractApplicationContext中初始化bean工厂的过程,包括设置类加载器、BeanExpressionResolver、ResourceEditorRegistrar,添加ApplicationContextAwareProcessor,配置自动装配规则,增加AspectJ支持以及注册环境变量和属性。此外,文章还提到了对各种Aware接口的处理和ApplicationListener的检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、方法功能概述

// 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());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步亿点点的小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值