Spring源码剖析——DefaultListableBeanFactory

本文深入剖析Spring Framework的DefaultListableBeanFactory,作为IoC的基础,它负责Bean的注册与管理。文章介绍了BeanFactory的核心功能,如别名注册、单例管理、Bean的创建和初始化,以及BeanPostProcessor在实现AOP中的作用。通过分析关键方法,如resolveBean、createBean和invokeAwareMethods,揭示了Spring如何处理Bean的生命周期和自动装配。

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

SpringFramework源码剖析——DefaultListableBeanFactory

大家都知道Spring框架主要提供了IoC与AOP两种能力,而IoC能力主要涉及到Bean的注册,AOP更多的是与上下文相关的配置。Bean的注册主要由BeanFactory负责,而ApplicationContext则负责程序完整上下文管理,从继承关系也可以看出来ApplicationContext是BeanFactory的超集,ApplicationContext是BeanFactory功能的拓展。

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
   
    @Nullable
    String getId();

    String getApplicationName();

    String getDisplayName();

    long getStartupDate();

    @Nullable
    ApplicationContext getParent();

    AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}

BeanFactory

官网介绍:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-beanfactory

官网介绍

官网介绍
总结:

  1. BeanFactory是IoC的基础,DefaultListableBeanFactory是关键的实现(看DefaultListableBeanFactory就行了)
  2. BeanFactory与其他组件交互主要通过 BeanFactoryAware, InitializingBean, DisposableBean这些类
  3. 底层BeanFactory不会感知配置的方式(通过xml还是注解来实现配置),配置的感知由拓展类(XmlBeanDefinitionReader 、AutowiredAnnotationBeanPostProcessor)实现。

DefaultListableBeanFactory源码

从DefaultListableBeanFactory开始,整个继承关系如下:
DefaultListableBeanFactory继承关系
各个类、接口功能大概描述一下:
AliasRegistry:别名注册接口,定义别名增删改查动作
SimpleAliasRegistry:管理一个aliasMap,注册别名
SingletonBeanRegistry:定义单例的注册获取相关动作
DefaultSingletonBeanRegistry:SingletonBeanRegistry的最简单实现,实现了单例bean的注册,著名的三层缓存解决循环依赖在源码中也有体现。

@Nullable
    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
   
        Object singletonObject = this.singletonObjects.get(beanName);
        if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
   
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {
   
                synchronized(this.singletonObjects) {
   
                    singletonObject = this.singletonObjects.get(beanName);
                    if (singletonObject == null) {
   
                        singletonObject = this.earlySingletonObjects.get(beanName);
                        if (singletonObject == null) {
   
                            ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);
                            if (singletonFactory != null) {
   
                                singletonObject = singletonFactory.getObject();
                                this.earlySingletonObjects.put(beanName, singletonObject);
                                this.singletonFactories.remove(beanName);
                            }
                        }
                    }
                }
            }
        }

        return singletonObject;
    }

BeanFactory:BeanFactory的基本定义,特殊前缀 FACTORY_BEAN_PREFIX = “&”;
FactoryBeanRegistrySupport:继承DefaultSingletonBeanRegistry,实际上也是一个单例的注册器,只不过是针对FactoryBean特殊处理的,维护一个factoryBeanObjectCache的Map
ConfigurableBeanFactory:提供了配置化Bean的实现,在HierarchicalBeanFactory, SingletonBeanRegistry基础上,增加了SCOPE类型(singleton\prototype),增加了Bean的额外的配置信息
AutowireCapableBeanFactory:提供了自动装配Bean的实现,提供bean创建(带有构造函数解析)、属性填充、连接(包括自动装配)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动装配构造函数、按名称的属性和按类型的属性。
ListableBeanFactory:提供了一系列枚举Bean的方法,比如根据Type把相关的Bean列出来、根据Annotation把相关Bean列出来等。
ConfigurableListableBeanFactory:整合ConfigurableBeanFactory、AutowireCapableBeanFactory、ListableBeanFactory。
AbstractBeanFactory:支持管理FactoryBean与通过配置的方式注册的Bean的抽象类。
AbstractAutowireCapableBeanFactory:继承了AbstractBeanFactory与实现了AutowireCapableBeanFactory接口,支持管理通过autowire自动装配注册的bean与配置方式注册的Bean。
DefaultListableBeanFactory:spring中最基础的BeanFactory实现类,官方API描述:Spring’s default implementation of the ConfigurableListableBeanFactory and BeanDefinitionRegistry interfaces: a full-fledged bean factory based on bean definition metadata, extensible through post-processors.

关键代码
resolveBean方法:根据Type获取对应的NameBean实例
private <T> T resolveBean(ResolvableType requiredType, @Nullable Object[] args, boolean nonUniqueAsNull) {
   
        NamedBeanHolder<T> namedBean = this.resolveNamedBean(requiredType, args, nonUniqueAsNull);//先本Factory处理
        if (namedBean != null) {
   
            return namedBean.getBeanInstance()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值