当前位置: 首页 > article >正文

SpringBoot源码解析(八):Bean工厂接口体系

SpringBoot源码系列文章

SpringBoot源码解析(一):SpringApplication构造方法

SpringBoot源码解析(二):引导上下文DefaultBootstrapContext

SpringBoot源码解析(三):启动开始阶段

SpringBoot源码解析(四):解析应用参数args

SpringBoot源码解析(五):准备应用环境

SpringBoot源码解析(六):打印Banner

SpringBoot源码解析(七):应用上下文结构体系

SpringBoot源码解析(八):Bean工厂接口体系


目录

  • 前言
  • 一、DefaultListableBeanFactory类图
  • 二、DefaultListableBeanFactory组件功能解析
    • 1、BeanFactory(Bean管理核心接口)
    • 2、HierarchicalBeanFactory(支持父子容器)
    • 3、ListableBeanFactory(批量获取Bean)
    • 4、AutowireCapableBeanFactory(自动装配Bean工厂)
    • 5、SingletonBeanRegistry(单例bean的注册与管理)
    • 6、ConfigurableBeanFactory(可配置的Bean工厂)
    • 7、ConfigurableListableBeanFactory(可配置可列举Bean工厂)
    • 8、SimpleAliasRegistry(简单别名注册)
    • 9、DefaultSingletonBeanRegistry(默认单例Bean注册)
    • 10、FactoryBeanRegistrySupport(FactoryBean注册支持类)
    • 11、AbstractBeanFactory(抽象Bean工厂)
    • 12、AbstractAutowireCapableBeanFactory(抽象自动装配Bean工厂)
    • 13、BeanDefinitionRegistry(Bean定义注册)
    • 14、DefaultListableBeanFactory(默认可列举Bean工厂)
  • 总结

前言

  在前文中,我们详细概述了SpringBoot架构中应用上下文结构体系的各个组件。其中,通用应用上下文(GenericApplicationContext)通过创建 DefaultListableBeanFactory负责注册、管理和创建Bean定义,同时支持依赖注入和动态Bean管理DefaultListableBeanFactory结构相对复杂,接下来我们将对其组件逐一进行介绍。

在这里插入图片描述

一、DefaultListableBeanFactory类图

在这里插入图片描述

二、DefaultListableBeanFactory组件功能解析

1、BeanFactory(Bean管理核心接口)

  BeanFactory是Spring框架中最基础的IOC(Inversion of Control,控制反转)容器接口,它负责创建管理配置应用中的Bean(对象),并处理Bean的依赖注入生命周期管理。BeanFactory支持延迟加载(懒加载),即在首次请求时才实例化Bean,适用于轻量级应用或资源受限的环境。

public interface BeanFactory {// bean名称前加&,返回的FactoryBean工厂实例,否则返回实际创建类型实例String FACTORY_BEAN_PREFIX = "&";// 根据指定的名称获取Bean实例// 返回的实例可能是单例模式下的共享实例,也可能是每次请求都会创建的新实例,具体取决于 Bean 的配置// 如果容器中不存在该名称的 Bean,则会抛出异常Object getBean(String name) throws BeansException;// 根据指定的名称和类型获取Bean实例// 如果名称对应的 Bean 类型与指定的类型不匹配,则会抛出异常<T> T getBean(String name, Class<T> requiredType) throws BeansException;// 根据指定的名称和参数获取Bean实例Object getBean(String name, Object... args) throws BeansException;// 根据指定的类型获取唯一匹配的Bean实例// 如果容器中不存在该类型的 Bean,或者存在多个该类型的 Bean,则会抛出异常 <T> T getBean(Class<T> requiredType) throws BeansException;// 根据指定的类型和参数获取Bean实例<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;// 返回一个可以提供指定类型Bean的ObjectProvider对象// ObjectProvider不会立即实例化Bean,只有在调用其方法时才会加载或创建Bean<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);// 通过ResolvableType,可以获取复杂类型或泛型Bean// 可以定义复杂的泛型结构,如 List<MyBean>、Map<String, MyBean> 等<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);// 检查容器中是否存在指定名称的 Beanboolean containsBean(String name);// 检查指定名称的Bean是否为单例(一个类只能有一个实例)boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 检查指定名称的Bean是否为原型(每次获取返回一个新实例)boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 检查指定名称的Bean是否匹配某个ResolvableType// 例如,检查一个Bean是否是List<String>类型boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;// 检查指定名称的Bean是否匹配某个Class类型// 这是基础的类型匹配检查,不支持泛型,但速度更快boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;// 返回Bean的Class类型(不考虑FactoryBean情况)@NullableClass<?> getType(String name) throws NoSuchBeanDefinitionException;// 返回Bean的Class类型// allowFactoryBeanInit=true,初始化FactoryBean返回实际类型@NullableClass<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;// 获取Bean的所有别名String[] getAliases(String name);
}

2、HierarchicalBeanFactory(支持父子容器)

  HierarchicalBeanFactory是Spring框架中定义的一个接口,它扩展了BeanFactory,用于支持Bean工厂的层次化结构管理。它的设计目的是允许一个Bean工厂拥有父级Bean工厂,并能够在当前Bean工厂和父级工厂之间协调Bean的管理和查找。

public interface HierarchicalBeanFactory extends BeanFactory {// 返回父级Bean工厂,如果没有父级,则返回null@NullableBeanFactory getParentBeanFactory();// 判断本地 Bean 工厂是否包含指定名称的 Bean,忽略父级上下文中定义的 Beanboolean containsLocalBean(String name);
}

3、ListableBeanFactory(批量获取Bean)

  ListableBeanFactory是Spring框架中的一个接口,它扩展了BeanFactory,提供了按照类型、名称等多种方式列出Bean的功能。它是Spring应用上下文中一个核心接口,用于管理和访问Bean。

// "只考虑当前工厂":检查范围限定为当前工厂的直接定义部分
// "不考虑层次结构":不会递归查询父工厂或祖先工厂中的定义
public interface ListableBeanFactory extends BeanFactory {	// 检查此 Bean 工厂是否包含具有给定名称的 Bean 定义boolean containsBeanDefinition(String beanName);// 返回工厂中定义的 Bean 数量int getBeanDefinitionCount();// 返回此工厂中定义的所有 Bean 的名称String[] getBeanDefinitionNames();// 返回一个可以提供指定类型Bean的ObjectProvider对象,可选择是否延迟初始化<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType, boolean allowEagerInit);// 返回一个可以提供复杂指定类型Bean的ObjectProvider对象,可选择是否延迟初始化<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType, boolean allowEagerInit);// 返回与给定类型(包括给定类型子类)匹配的 Bean 名称String[] getBeanNamesForType(ResolvableType type);// 返回与给定复杂类型(包括给定子类)匹配的 Bean 名称// 并允许对非单例 Bean 和延迟加载 Bean 进行控制String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit);// 返回与给定类型(包括子类)匹配的 Bean 名称String[] getBeanNamesForType(@Nullable Class<?> type);// 返回与给定类型(包括子类)匹配的 Bean 名称// 并允许对非单例 Bean 和延迟加载 Bean 进行控制String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);// 返回一个 Map,包含匹配的 Bean 名称和对应的 Bean 实例<T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;// 返回一个 Map,包含匹配的 Bean 名称和对应的 Bean 实例// 并允许对非单例 Bean 和延迟加载 Bean 进行控制<T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)throws BeansException;// 查找带有指定注解的所有 Bean 名称String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);// 一个 Map,包含匹配的 Bean 名称和对应带指定注解的Bean实例Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;// 用于查找指定 Bean 上的特定类型注解,并返回该注解的实例@Nullable<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)throws NoSuchBeanDefinitionException;// 用于查找指定 Bean 上的特定注解,并提供一个参数来控制是否允许初始化 FactoryBean@Nullable<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType, boolean allowFactoryBeanInit)throws NoSuchBeanDefinitionException;
}

4、AutowireCapableBeanFactory(自动装配Bean工厂)

  AutowireCapableBeanFactory用于在Spring容器外手动管理和操作bean,包括实例化依赖注入初始化以及应用BeanPostProcessor等功能。

public interface AutowireCapableBeanFactory extends BeanFactory {// 不进行自动装配int AUTOWIRE_NO = 0;// 根据属性名称自动装配int AUTOWIRE_BY_NAME = 1;// 根据属性类型自动装配int AUTOWIRE_BY_TYPE = 2;// 通过构造函数自动装配int AUTOWIRE_CONSTRUCTOR = 3;// 是一个后缀,用于获取Bean的原始实例(未被代理或增强的版本)String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";// 用于根据指定的 beanClass 创建一个新的 Bean 实例<T> T createBean(Class<T> beanClass) throws BeansException;// 用于对已存在对象(非由 Spring 容器创建的对象)执行自动装配@Autowired等// 但不会将该对象纳入Spring容器管理void autowireBean(Object existingBean) throws BeansException;// 用于对已存在对象(非由 Spring 容器创建的对象)纳入Spring容器的管理中,beanName就是其名称// 应用 Spring 的依赖注入、生命周期回调以及其他配置Object configureBean(Object existingBean, String beanName) throws BeansException;// 使用指定的自动装配策略创建一个新的Bean实例// autowireMode:自动装配类型,上面的常量,不自动装配、根据名称类型、构造函数// dependencyCheck:是否进行依赖检查,否验证所有必需的依赖是否已被正确注入Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;// 为某个spring管理的Bean自动装配Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;// 与上面说到的autowireBean方法一样// 对已存在对象(非由 Spring 容器创建的对象)执行自动装配,只是添加一些策略void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)throws BeansException;// 应用Bean定义中的属性值到指定的 Bean 实例void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;// 对已实例化和属性填充完成的bean执行初始化操作// 包括调用生命周期回调方法和应用BeanPostProcessor的前后处理逻辑Object initializeBean(Object existingBean, String beanName) throws BeansException;// 初始化bean之前,调用所有注册的BeanPostProcessor的postProcessBeforeInitialization方法// 以便对 bean 进行自定义自定义的增强或修改Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException;// 初始化bean之前,调用所有注册的BeanPostProcessor的postProcessAfterInitialization方法// 用于在 bean 完成初始化后对其进行进一步的处理或增强Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException;// 销毁指定的 Bean 实例void destroyBean(Object existingBean);// 根据指定类型查找对应的bean,并返回一个bean实例和bean名称捆绑对象NamedBeanHolder// 如果容器中有多个同类型的 bean,可以返回一个符合类型的bean和其名称<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;// 根据给定的bean名称和依赖描述符 查找并返回匹配的bean实例// DependencyDescriptor:封装了关于依赖的元数据,如依赖的类型、作用域等Object resolveBeanByName(String name, DependencyDescriptor descriptor) throws BeansException;// 主要用于根据依赖描述符查找bean实例,名称可选@NullableObject resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;// 用于根据依赖描述符、请求bean名称、自动装配bean名称集合和类型转换器解析查询Bean实例@NullableObject resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;
}

5、SingletonBeanRegistry(单例bean的注册与管理)

  SingletonBeanRegistry是Spring提供的一个接口,用于定义单例Bean注册获取判断是否存在获取单例名称等功能。

// 接口定义了一个共享单例bean的缓存。以统一的方式公开其单例管理功能
public interface SingletonBeanRegistry {// 将指定的单例对象以给定的 Bean 名称注册到 Spring 容器的单例缓存中void registerSingleton(String beanName, Object singletonObject);// 根据给定的名称返回(原始的)已注册的单例对象@NullableObject getSingleton(String beanName);// 用于检查Spring容器中是否已注册了具有指定名称的单例对象boolean containsSingleton(String beanName);// 返回当前已注册的所有单例Bean名称的数组String[] getSingletonNames();// 返回当前容器中已注册的单例对象的数量int getSingletonCount();// 主要作用是提供一个全局的同步锁对象// 用于确保在多线程环境中对单例对象的注册和访问操作是线程安全的Object getSingletonMutex();
}

6、ConfigurableBeanFactory(可配置的Bean工厂)

  ConfigurableBeanFactory是Spring中定义的一个可配置的Bean工厂接口,提供了对Bean定义的管理生命周期控制作用域注册依赖关系处理的扩展功能。

// 用于大多数 Bean 工厂实现的配置接口。提供了额外的功能来配置 Bean 工厂
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {// ==================== Scope 标识符 ====================// 标准单例作用域的标识符String SCOPE_SINGLETON = "singleton";// 标准原型作用域的标识符String SCOPE_PROTOTYPE = "prototype";// ==================== 父工厂设置与获取 ====================// 设置该 Bean 工厂的父工厂void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;// 省略类加载器相关、Bean元数据缓存、表达式与转换、属性编辑器与类型转换、嵌入值解析...// ==================== Bean 后置处理器 ====================// 添加一个 BeanPostProcessorvoid addBeanPostProcessor(BeanPostProcessor beanPostProcessor);// 返回当前注册的 BeanPostProcessor 的数量int getBeanPostProcessorCount();// 省略自定义作用域...// ==================== 工厂配置复制 ====================// 从另一个 ConfigurableBeanFactory 中复制所有相关的配置设置到当前工厂// 简化工厂的配置管理,支持配置共享和继承void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);// ==================== Bean 别名相关 ====================// 为指定的 Bean 注册别名void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;// 通过指定的解析器,解析并动态修改工厂中定义的别名void resolveAliases(StringValueResolver valueResolver);// ==================== 合并 Bean 定义 ====================// 返回指定 beanName 的合并后 BeanDefinition// 即父子结构中,将父BeanDefinition的属性与子BeanDefinition合并后的结果BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;// ==================== FactoryBean 检查 ====================// 判断指定名称的 Bean 是否为 FactoryBeanboolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;// ==================== Bean 创建状态 ====================// 显式设置指定 Bean 的当前创建状态void setCurrentlyInCreation(String beanName, boolean inCreation);// 检查指定 Bean 是否正在创建中boolean isCurrentlyInCreation(String beanName);// ==================== Bean 依赖管理 ====================// 注册一个依赖关系,表明 dependentBeanName 依赖于 beanName// 用于跟踪 Bean 之间的依赖关系,以便在销毁 beanName 时正确销毁其依赖的 Beanvoid registerDependentBean(String beanName, String dependentBeanName);// 返回所有依赖于指定 beanName 的 Bean 名称数组String[] getDependentBeans(String beanName);// 返回指定 beanName 所依赖的所有 Bean 名称数组String[] getDependenciesForBean(String beanName);// ==================== Bean 销毁 ====================// 销毁指定的 Bean 实例void destroyBean(String beanName, Object beanInstance);// 销毁当前作用域中的指定 Scoped Beanvoid destroyScopedBean(String beanName);// 销毁工厂中所有的单例 Beanvoid destroySingletons();
}

7、ConfigurableListableBeanFactory(可配置可列举Bean工厂)

  ConfigurableListableBeanFactory是Spring中一个可配置且可列举的BeanFactory,提供对Bean定义的详细管理、修改以及单例Bean的预实例化功能。

// 在ConfigurableBeanFactory的基础上,提供了分析和修改 Bean 定义、以及预实例化单例 Bean 的功能
public interface ConfigurableListableBeanFactoryextends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {// 用于告诉依赖注入框架忽略指定类型,不对其进行自动注入解析void ignoreDependencyType(Class<?> type);// 用于告诉框架忽略某个接口类型的依赖注入void ignoreDependencyInterface(Class<?> ifc);// 注册一个依赖类型及其对应值,供自动注入时使用void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);// 用于检查指定的 Bean 是否可以作为依赖注入的候选项,根据 Bean 的定义及依赖描述来确定boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)throws NoSuchBeanDefinitionException;// 返回指定 Bean 的定义对象 (BeanDefinition),用于描述和管理 Bean 的配置信息BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;// 返回一个迭代器,用于遍历所有已注册的 Bean 名称Iterator<String> getBeanNamesIterator();// 清空 Bean 元数据的缓存,通常用于调试或强制刷新配置状态void clearMetadataCache();// 冻结所有 Bean 定义,表明注册的 Bean 定义不再会被修改或后处理void freezeConfiguration();// 判断此工厂的 Bean 定义是否已冻结boolean isConfigurationFrozen();// 提前实例化所有定义为单例作用域的 Bean,以确保它们在容器启动时被创建并初始化void preInstantiateSingletons() throws BeansException;
}

8、SimpleAliasRegistry(简单别名注册)

  SimpleAliasRegistry是Spring框架中用于注册管理解析别名(alias)映射的简单工具类,提供别名的增删查功能并防止循环引用。

public class SimpleAliasRegistry implements AliasRegistry {// Key:存储别名,Value:存储别名对应的实际名称private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);// ... 省略AliasRegistry接口的全部功能的实现方法
}// 管理别名的通用接口(提供了注册、删除、查询别名的方法)
public interface AliasRegistry {// 为给定的名称注册一个别名void registerAlias(String name, String alias);// 从注册表中删除指定的别名void removeAlias(String alias);// 确定给定的名称是否被定义为别名(而不是实际注册的组件名称)boolean isAlias(String name);// 返回给定名称的所有别名(如果定义了别名)String[] getAliases(String name);
}

9、DefaultSingletonBeanRegistry(默认单例Bean注册)

  DefaultSingletonBeanRegistry是Spring中用于管理单例Bean的基础类,支持单例Bean注册缓存销毁循环依赖处理,同时继承SimpleAliasRegistry以支持别名管理。

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {// ==================== 核心属性 ====================// 一级缓存:存储已经完成初始化的单例Bean(是单例 Bean 的主缓存)private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);// 二级缓存:存储早期暴露的单例对象,这些对象可能尚未完全初始化(用于解决循环依赖问题)private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);// 三级缓存:存储创建单例对象的工厂,这些工厂可以在需要时生成对应的单例对象(延迟加载机制,将单例对象的创建延后到需要时再执行)private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);// 存储所有已经注册为单例的 Bean 名称private final Set<String> registeredSingletons = new LinkedHashSet<>(256);// ==================== 核心方法 ====================// 注册单例对象@Overridepublic void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException {...}// 获取单例对象@Override@Nullablepublic Object getSingleton(String beanName) {...}// 销毁指定名称的单例 Beanpublic void destroySingleton(String beanName) {...}
}

10、FactoryBeanRegistrySupport(FactoryBean注册支持类)

  FactoryBeanRegistrySupport是Spring容器中用于支持FactoryBean实例管理的基类,负责从FactoryBean获取对象处理单例缓存以及提供扩展后的后处理能力

public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry {// 缓存由 FactoryBean 创建的单例对象,映射为:FactoryBean名称 -> 对象private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<>(16);// ==================== 核心方法 ====================// 确定给定 FactoryBean 的类型@Nullableprotected Class<?> getTypeForFactoryBean(FactoryBean<?> factoryBean) {...}// 获取由给定 FactoryBean 创建的对象protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {...}// 这是一个模板方法,默认实现直接返回从 FactoryBean 中获取的对象// 子类可以通过重写这个方法,对获取到的对象进行自定义后处理(添加代理、应用额外的拦截器、动态修改对象的属性等)protected Object postProcessObjectFromFactoryBean(Object object, String beanName) throws BeansException {return object;}
}

11、AbstractBeanFactory(抽象Bean工厂)

  AbstractBeanFactory是Spring框架中BeanFactory接口的抽象实现,负责提供Bean的基础获取和管理功能,但不包含具体的Bean创建逻辑。

public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {// 表示当前 BeanFactory 的父工厂(支持层级结构),用于递归地从父工厂中查找 Bean@Nullableprivate BeanFactory parentBeanFactory;// ==================== 核心方法 ====================// 通过名称获取 Bean 的主入口,内部调用 doGetBean 方法@Overridepublic Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false);}// 按类型获取 Bean,并进行类型检查@Overridepublic <T> T getBean(String name, Class<T> requiredType) throws BeansException {return doGetBean(name, requiredType, null, false);}// 核心实现方法(1.别名解析 2.缓存检查:先从单例缓存中获取 3.创建对象 4.依赖处理:递归解决依赖 Bean)protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)throws BeansException {...}// 创建Bean的抽象方法,具体的实例化逻辑由子类protected abstract Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException;
}

12、AbstractAutowireCapableBeanFactory(抽象自动装配Bean工厂)

  AbstractAutowireCapableBeanFactory是Spring框架中AbstractBeanFactory的具体实现类,负责处理Bean的创建属性注入自动装配逻辑,提供Spring容器中Bean管理的核心功能。


public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// 存储所有注册的 BeanPostProcessor,用于在 bean 初始化前后进行自定义逻辑处理private final List<BeanPostProcessor> beanPostProcessors = new BeanPostProcessorCacheAwareList();// ==================== 核心方法 ====================// 创建一个完整的 bean 实例,处理了整个生命周期,包括依赖注入、初始化以及后处理@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {...}// 内部调用,用于创建 bean 实例的核心方法,负责实例化、依赖注入和初始化protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {...}// 通过无参构造器实例化 beanprotected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) {...}// 解析依赖关系,找到依赖的目标 bean@Override@Nullablepublic Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {...}// 填充 bean 的属性,支持自动装配protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {...}// 完成 bean 的初始化工作,调用 BeanPostProcessor 和初始化回调方法protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {...}
}

13、BeanDefinitionRegistry(Bean定义注册)

  BeanDefinitionRegistry是Spring容器中管理和操作 BeanDefinition 的核心接口,提供动态注册删除查询Bean定义的方法。

public interface BeanDefinitionRegistry extends AliasRegistry {// 注册一个新的 BeanDefinition 到当前注册表中。// 必须支持 RootBeanDefinition 和 ChildBeanDefinition。void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException;// 根据给定的名称移除对应的 BeanDefinitionvoid removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;// 返回给定名称对应的 BeanDefinitionBeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;// 检查注册表中是否包含给定名称的 BeanDefinitionboolean containsBeanDefinition(String beanName);// 返回当前注册表中定义的所有 Bean 的名称String[] getBeanDefinitionNames();// 返回当前注册表中定义的 Bean 总数int getBeanDefinitionCount();// 判断给定的 bean 名称是否已被使用(包括本地 bean 或别名)boolean isBeanNameInUse(String beanName);
}

14、DefaultListableBeanFactory(默认可列举Bean工厂)

  DefaultListableBeanFactory是Spring框架中的一个核心类,负责管理创建应用上下文中的所有Bean,提供了Bean定义的注册、查找和生命周期管理功能。

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {// ==================== 核心属性 ====================// 存储所有注册的 BeanDefinition,键为 beanName,值为对应的 BeanDefinitionprivate final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);// 记录所有注册的beanName,保持注册顺序(通过配置文件、注解、或约定方式将 Bean 注册到容器中,由 Spring 自动完成)private volatile List<String> beanDefinitionNames = new ArrayList<>(256);// 存储手动注册的单例Bean名称(通过编程方式显式地将 Bean 注册到 Spring 容器中)private volatile Set<String> manualSingletonNames = new LinkedHashSet<>(16);// 存储直接可解析的依赖项(如环境变量或系统资源)private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16);// 缓存按类型解析的所有 Bean 名称private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64);// 缓存按类型解析的单例 Bean 名称private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64);// ==================== 核心方法 ====================// ...省略BeanDefinitionRegistry接口实现的功能// 获取指定类型的所有 Bean 名称,可通过参数控制是否包含非单例和是否允许提前初始化@Overridepublic String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit) {...}// 获取指定类型的所有 Bean 实例@Override@SuppressWarnings("unchecked")public <T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException {...}// 获取带有指定注解的所有 Bean 名称@Overridepublic String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType) {...}// 获取带有指定注解的所有 Bean 实例@Overridepublic Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) {...}// 提前初始化所有非懒加载的单例 Bean@Overridepublic void preInstantiateSingletons() throws BeansException {...}
}

总结

  DefaultListableBeanFactory是Spring框架中核心的IOC容器实现,作为一个功能全面的Bean工厂,它同时实现了多个接口,集成了Bean的注册管理创建检索销毁等核心功能,支持按名称类型注解等多种方式获取 Bean。

  它具备强大的依赖注入自动装配能力,支持动态注册Bean定义、生命周期管理、作用域扩展,以及多级缓存(解决循环依赖),同时提供对单例和多实例Bean的高效管理,是Spring应用上下文的基础。

相关文章:

SpringBoot源码解析(八):Bean工厂接口体系

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args Sp…...

在ubuntu下一键安装 Open WebUI

该脚本用于自动化安装 Open WebUI&#xff0c;并支持以下功能&#xff1a; 可选跳过 Ollama 安装&#xff1a;通过 --no-ollama 参数跳过 Ollama 的安装。自动清理旧目录&#xff1a;如果安装目录 (~/open-webui) 已存在&#xff0c;脚本会自动删除旧目录并重新安装。完整的依…...

Flutter子页面向父组件传递数据方法

在 Flutter 中&#xff0c;如果父组件需要调用子组件的方法&#xff0c;可以通过以下几种方式实现。以下是常见的几种方法&#xff1a; 方法 1&#xff1a;使用 GlobalKey 和 State 调用子组件方法 这是最直接的方式&#xff0c;通过 GlobalKey 获取子组件的 State&#xff0c…...

论文阅读 AlphaFold 2

用AlphaFold进行非常精确的蛋白质结构的预测(AlphaFold2) 发表于2021年07月15日 NatureDOI: 10.1038/s41586-021-03819-2自然和科学杂志评选为2021年最重要的科学突破之一2021年AI在科学界最大的突破 前言 2020年11月30号, deepmind博客说AlphaFold解决了50年以来生物学的大挑…...

计算机网络 (62)移动通信的展望

一、技术发展趋势 6G技术的崛起 内生智能&#xff1a;6G将强调自适应网络架构&#xff0c;通过AI驱动的智能算法提升通信能力。例如&#xff0c;基于生成式AI的6G内生智能架构将成为重要研究方向&#xff0c;实现低延迟、高效率的智能通信。信息编码与调制技术&#xff1a;新型…...

如何学习Java后端开发

文章目录 一、Java 语言基础二、数据库与持久层三、Web 开发基础四、主流框架与生态五、分布式与高并发六、运维与部署七、项目实战八、持续学习与提升总结路线图 学习 Java 后端开发需要系统性地掌握多个技术领域&#xff0c;从基础到进阶逐步深入。以下是一个详细的学习路线和…...

探索与创新:DeepSeek R1与Ollama在深度研究中的应用

在当今信息爆炸的时代&#xff0c;获取和处理信息的能力变得至关重要。特别是在学术和研究领域&#xff0c;如何有效地进行深度研究是一个亟待解决的问题。最近&#xff0c;一个名为DeepSeek R1的模型结合Ollama平台提供了一种创新的解决方案。本文将分析并解构这一新兴的研究工…...

Linux 常用命令 - sort 【对文件内容进行排序】

简介 sort 命令源于英文单词 “sort”&#xff0c;表示排序。其主要功能是对文本文件中的行进行排序。它可以根据字母、数字、特定字段等不同的标准进行排序。sort 通过逐行读取文件&#xff08;没有指定文件或指定文件为 - 时读取标准输入&#xff09;内容&#xff0c;并按照…...

mantisbt添加修改用户密码

文章目录 问题当前版本安装流程创建用户修改密码老的方式探索阶段 问题 不太好改密码啊。貌似必须要域名要发邮件。公司太穷&#xff0c;看不见的东西不关心&#xff0c;只能改源码了。 当前版本 当前mantisbt版本 2.27 php版本 7.4.3 安装流程 &#xff08;下面流程不是…...

记录 | Docker的windows版安装

目录 前言一、1.1 打开“启用或关闭Windows功能”1.2 安装“WSL”方式1&#xff1a;命令行下载方式2&#xff1a;离线包下载 二、Docker Desktop更新时间 前言 参考文章&#xff1a;Windows Subsystem for Linux——解决WSL更新速度慢的方案 参考视频&#xff1a;一个视频解决D…...

【Elasticsearch】内置分词器和IK分词器

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

2025美赛数学建模C题:奥运金牌榜,完整论文代码模型目前已经更新

2025美赛数学建模C题&#xff1a;奥运金牌榜&#xff0c;完整论文代码模型目前已经更新&#xff0c;获取见文末名片...

HarmonyOS:ForEach:循环渲染

一、前言 ForEach接口基于数组类型数据来进行循环渲染&#xff0c;需要与容器组件配合使用&#xff0c;且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如&#xff0c;ListItem组件要求ForEach的父容器组件必须为List组件。 API参数说明见&#xff1a;ForEa…...

Effective C++ 规则50:了解 new 和 delete 的合理替换时机

1、背景 在 C 中&#xff0c;new 和 delete 是动态分配内存的核心操作符。然而&#xff0c;直接使用它们有时会增加程序的复杂性&#xff0c;甚至导致内存泄漏和其他问题。因此&#xff0c;了解何时替换 new 和 delete 并选择更适合的内存管理策略&#xff0c;是编写高效、健壮…...

C++ STL:深入探索常见容器

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…...

android12源码中用第三方APK替换原生launcher

一、前言 如何用第三方的apk替换原生launcher呢&#xff1f;我是参考着这位大神的博客https://blog.csdn.net/hyu001/article/details/131044358做的&#xff0c;完美实现。 这边博客中又加入了我个人的一些改变&#xff0c;整理的。 二、步骤 1.在/packages/apps/MyApp文件…...

Java面试题2025-设计模式

1.说一下开发中需要遵守的设计原则&#xff1f; 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; 1、单一职责原则 单一职责原则的定义描述非…...

【设计模式-行为型】备忘录模式

一、什么是备忘录模式 来到备忘录模式了&#xff0c;这个模式我感觉相对简单一些&#xff0c;就是备份&#xff0c;或者快照。跟前面一样为了加深理解&#xff0c;我们引入一个电影情结来说明啥是备忘录模式&#xff0c;以来加深大家对备忘录模式的认识。那么&#xff0c;在电影…...

flink StreamGraph解析

Flink程序有三部分operation组成&#xff0c;分别是源source、转换transformation、目的地sink。这三部分构成DAG。 DAG首先生成的是StreamGraph。 用户代码在添加operation的时候会在env中缓存&#xff08;变量transformations&#xff09;&#xff0c;在env.execute()执行的…...

本地AI模型:未来智能设备的核心驱动力

标题&#xff1a;“本地AI模型&#xff1a;未来智能设备的核心驱动力” 文章信息摘要&#xff1a; 未来AI设备&#xff08;如Meta Ray-Bans&#xff09;的发展将更加依赖本地语言模型的优化与集成&#xff0c;而非仅依靠云端AI模型。本地模型在隐私保护、推理速度和离线访问方…...

基于SpringBoot的网上摄影工作室开发与实现 | 含论文、任务书、选题表

随着互联网技术的不断发展&#xff0c;摄影爱好者们越来越需要一个在线平台来展示和分享他们的作品。基于SpringBoot的网上摄影工作室应运而生&#xff0c;它不仅为用户提供了一个展示摄影作品的平台&#xff0c;还为管理员提供了便捷的管理工具。本文幽络源将详细介绍该系统的…...

数字人+展厅应用方案:开启全新沉浸式游览体验

随着人们生活质量的不断提升&#xff0c;对于美好体验的追求日益增长。在展厅展馆领域&#xff0c;传统的展示方式已难以满足大众日益多样化的需求。而通过将数字人与展厅进行深度结合&#xff0c;可以打造数字化、智能化新型展厅&#xff0c;不仅能提升展示效果&#xff0c;还…...

基于单片机的家用无线火灾报警系统的设计

1 总体设计 本设计家用无线火灾报警系统利用单片机控制技术、传感器检测技术、GSM通信技术展开设计&#xff0c;如图2.1所示为本次系统设计的主体框图&#xff0c;系统包括单片机主控模块、温度检测模块、烟雾检测模块、按键模块、GSM通信模块、液晶显示模块、蜂鸣器报警模块。…...

多级缓存(亿级并发解决方案)

多级缓存&#xff08;亿级流量&#xff08;并发&#xff09;的缓存方案&#xff09; 传统缓存的问题 传统缓存是请求到达tomcat后&#xff0c;先查询redis&#xff0c;如果未命中则查询数据库&#xff0c;问题如下&#xff1a; &#xff08;1&#xff09;请求要经过tomcat处…...

iic、spi以及uart

何为总线&#xff1f; 连接多个部件的信息传输线&#xff0c;是部件共享的传输介质 总线的作用&#xff1f; 实现数据传输&#xff0c;即模块之间的通信 总线如何分类&#xff1f; 根据总线连接的外设属于内部外设还是外部外设将总线可以分为片内总线和片外总线 可分为数…...

Shell编程(for循环+并发问题+while循环+流程控制语句+函数传参+函数变量+函数返回值+反向破解MD5)

本篇文章继续给大家介绍Shell编程&#xff0c;包括for循环、并发问题&#xff0c;while循环&#xff0c;流程控制语句&#xff0c;函数传参、函数变量、函数返回值&#xff0c;反向破解MD5等内容。 1.for循环 for 变量 in [取值列表] 取值列表可以是数字 字符串 变量 序列…...

深入 Rollup:从入门到精通(三)Rollup CLI命令行实战

准备阶段&#xff1a;初始化项目 初始化项目&#xff0c;这里使用的是pnpm&#xff0c;也可以使用yarn或者npm # npm npm init -y # yarn yarn init -y # pnpm pnpm init安装rollup # npm npm install rollup -D # yarn yarn add rollup -D # pnpm pnpm install rollup -D在…...

CycleGAN模型解读(附源码+论文)

CycleGAN 论文链接&#xff1a;Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 官方链接&#xff1a;pytorch-CycleGAN-and-pix2pix 老规矩&#xff0c;先看看效果 总体流程 先简单过一遍流程&#xff0c;细节在代码里说。CycleGAN有…...

线程配置经验

工作时&#xff0c;时常会遇到&#xff0c;线程相关的问题与解法&#xff0c;本人会持续对开发过程中遇到的关于线程相关的问题及解决记录更新记录在此篇博客中。 目录 一、线程基本知识 1. 线程和进程 二、问题与解法 1. 避免乘法级别数量线程并行 1&#xff09;使用线程池…...

动态规划DP 数字三角形模型 传纸条(题目分析+C++完整代码)

传纸条 原题链接 AcWing 275. 传纸条 题目描述 小渊和小轩是好朋友也是同班同学&#xff0c;他们在一起总有谈不完的话题。 一次素质拓展活动中&#xff0c;班上同学安排坐成一个 m行 n 列的矩阵&#xff0c;而小渊和小轩被安排在矩阵对角线的两端&#xff0c;因此&#x…...