Spring 源码深度解析:ApplicationContext 体系结构与 BeanDefinition 加载原理

关键词:Spring 源码, ApplicationContext, BeanFactory, BeanDefinition, 注解配置, XML 配置, 源码分析


写在前面

在前面手写 Spring 框架的系列文章中,我们已经从零实现了 IoCDIAOPBean 配置化功能。通过手写实践,我们对 Spring 的核心概念有了深入的理解。

本文将带大家进入 Spring 源码的世界,深入分析 ApplicationContext 的体系结构、BeanFactory 的实现机制,以及 BeanDefinition 的加载过程和继承体系。通过阅读本文,你将能够:

  • ✅ 理解 ApplicationContext 的完整继承体系
  • ✅ 掌握 BeanFactory 在 Spring 中的实现方式
  • ✅ 深入理解 BeanDefinition 的加载过程(XML + 注解)
  • ✅ 熟悉 BeanDefinition 的继承体系和各种实现类
  • ✅ 理解 Spring 中元数据和属性访问的设计

目录


一、ApplicationContext 体系结构

1.1 ApplicationContext 是什么

ApplicationContext 字面意思是"应用上下文",它是 Spring 框架中最核心的接口之一。

ApplicationContext = BeanFactory + 高级功能

功能说明
BeanFactoryIoC 容器的基础功能,Bean 的创建和管理
应用事件发布ApplicationEventPublisher,支持事件机制
资源加载ResourceLoader,加载配置文件等资源
环境参数EnvironmentCapable,获取系统环境变量
国际化MessageSource,支持多语言国际化

1.2 核心接口分析

ApplicationContext 继承结构

ApplicationContext
    │
    ├── ListableBeanFactory(可列表的 BeanFactory)
    │
    ├── HierarchicalBeanFactory(分层的 BeanFactory)
    │
    ├── MessageSource(国际化)
    │
    ├── ApplicationEventPublisher(事件发布)
    │
    └── ResourcePatternResolver(资源加载)

接口职责说明

接口功能核心方法
BeanFactoryBean 创建和管理getBean(), containsBean()
ListableBeanFactory批量获取 BeangetBeanDefinitionNames(), getBeansOfType()
HierarchicalBeanFactory父子容器getParentBeanFactory()
MessageSource国际化getMessage()
ApplicationEventPublisher事件发布publishEvent()
ResourcePatternResolver资源加载getResources()

1.3 实现类分支

ApplicationContext 的实现类有两个重要分支

ApplicationContext
    │
    ├── ConfigurableApplicationContext
    │       │
    │       ├── AbstractApplicationContext
    │       │       │
    │       │       ├── AbstractRefreshableApplicationContext ← 可刷新的上下文
    │       │       │       │
    │       │       │       ├── ClassPathXmlApplicationContext
    │       │       │       └── FileSystemXmlApplicationContext
    │       │       │
    │       │       └── GenericApplicationContext ← 通用上下文
    │       │               │
    │       │               ├── AnnotationConfigApplicationContext
    │       │               └── GenericXmlApplicationContext
    │       │
    │       └── WebApplicationContext(Web 应用专用)
    │
    └── ...

两大分支对比

分支特点代表实现
AbstractRefreshableApplicationContext每次刷新都会重建 BeanFactoryClassPathXmlApplicationContext
GenericApplicationContext可以在运行时动态注册 Bean 定义AnnotationConfigApplicationContext

二、BeanFactory 实现

2.1 BeanFactory 继承体系

BeanFactory 是 Spring IoC 容器的核心,ApplicationContext 内部也是通过 BeanFactory 来管理 Bean。

BeanFactory
    │
    ├── HierarchicalBeanFactory(支持父子容器)
    │       │
    │       └── ConfigurableBeanFactory(可配置)
    │               │
    │               ├── AutowireCapableBeanFactory(支持自动装配)
    │               │       │
    │               │       └── AbstractAutowireCapableBeanFactory
    │               │               │
    │               │               └── DefaultListableBeanFactory ← 最终实现
    │               │
    │               └── ConfigurableListableBeanFactory
    │
    └── ListableBeanFactory(可枚举)
            │
            └── ConfigurableListableBeanFactory
                    │
                    └── DefaultListableBeanFactory ← 最终实现

完整继承体系

DefaultListableBeanFactory
    └── AbstractAutowireCapableBeanFactory
            └── AbstractBeanFactory
                    ├── FactoryBeanRegistrySupport
                    └── ConfigurableBeanFactory
                            └── HierarchicalBeanFactory
                                    └── BeanFactory

2.2 DefaultListableBeanFactory

DefaultListableBeanFactory 是 Spring 中最核心的 BeanFactory 实现,它集成了所有功能:

public class DefaultListableBeanFactory 
    extends AbstractAutowireCapableBeanFactory
    implements ConfigurableListableBeanFactory, 
               BeanDefinitionRegistry, 
               Serializable {
    
    /** BeanDefinition 存储容器 */
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
    
    /** Bean 名称列表 */
    private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
    
    // ... 实现各种 BeanFactory 和 BeanDefinitionRegistry 接口的方法
}

核心功能

功能说明
BeanDefinition 注册实现 BeanDefinitionRegistry 接口,管理 Bean 定义
Bean 创建继承 AbstractAutowireCapableBeanFactory,创建 Bean 实例
依赖注入支持构造器注入、属性注入
自动装配支持 @Autowired 自动装配
单例管理管理单例 Bean 的生命周期

三、BeanDefinition 加载

3.1 XML 配置方式

XML 配置文件示例

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 普通 Bean 定义 -->
    <bean id="beanE" class="com.study.spring.sample.config.BeanE" />
    <bean id="beanF" class="com.study.spring.sample.config.BeanF" />

    <!-- 开启注解支持 -->
    <context:annotation-config/>
    
    <!-- 组件扫描 -->
    <context:component-scan base-package="com.study.spring.sample.config" />
</beans>

加载流程

public class XMLConfigMain {
    public static void main(String[] args) {
        // 创建 ApplicationContext
        ApplicationContext context = new GenericXmlApplicationContext(
            "classpath:com/study/spring/sample/config/application.xml"
        );
        
        // 获取 Bean
        BeanF bf = context.getBean(BeanF.class);
        bf.do1();
    }
}

处理流程

解析 XML 文件
    │
    ▼
解析 <bean> 元素
    │
    ▼
创建 BeanDefinition 对象
    │
    ▼
注册到 BeanDefinitionRegistry
    │
    ▼
通过 BeanFactory 创建 Bean

核心类XmlBeanDefinitionReader

public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader {
    
    /**
     * 从 XML 文件加载 Bean 定义
     */
    public int loadBeanDefinitions(String location) {
        // 1. 加载 XML 资源
        Resource resource = resourceLoader.getResource(location);
        
        // 2. 解析 XML
        Document document = doLoadDocument(resource);
        
        // 3. 解析 <bean> 元素
        return registerBeanDefinitions(document, resource);
    }
    
    /**
     * 解析并注册 BeanDefinition
     */
    public int registerBeanDefinitions(Document doc, Resource resource) {
        BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
        int countBefore = getRegistry().getBeanDefinitionCount();
        
        // 解析 Document
        documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
        
        return getRegistry().getBeanDefinitionCount() - countBefore;
    }
}

3.2 注解配置方式

配置类方式

@Configuration
@ComponentScan("com.study.spring.sample.config")
public class JavaBasedMain {
    
    @Bean
    public BeanH getBeanH() {
        return new BeanH();
    }

    public static void main(String[] args) {
        ApplicationContext context = 
            new AnnotationConfigApplicationContext(JavaBasedMain.class);
        
        BeanH bh = context.getBean(BeanH.class);
        bh.doH();
    }
}

扫描包方式

public class AnnotationMain {
    public static void main(String[] args) {
        ApplicationContext context = 
            new AnnotationConfigApplicationContext("com.study.spring.sample.config");
        
        BeanG bg = context.getBean(BeanG.class);
        bg.dog();
    }
}

注解配置两种方式

  1. 配置类方式:传入 @Configuration 注解的类
  2. 扫描路径方式:指定要扫描的包路径

3.3 扫描实现原理

AnnotationConfigApplicationContext 构造方法

public class AnnotationConfigApplicationContext extends GenericApplicationContext {
    
    private final AnnotatedBeanDefinitionReader reader;
    private final ClassPathBeanDefinitionScanner scanner;
    
    public AnnotationConfigApplicationContext() {
        // 1. 创建注解 Bean 定义读取器
        this.reader = new AnnotatedBeanDefinitionReader(this);
        
        // 2. 创建类路径 Bean 定义扫描器
        this.scanner = new ClassPathBeanDefinitionScanner(this);
    }
    
    public AnnotationConfigApplicationContext(String... basePackages) {
        this();
        // 扫描指定包
        scan(basePackages);
        refresh();
    }
    
    public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
        this();
        // 注册配置类
        register(componentClasses);
        refresh();
    }
}

核心组件

组件作用
AnnotatedBeanDefinitionReader读取注解类,解析 @Bean 方法
ClassPathBeanDefinitionScanner扫描包路径,查找 @Component

AnnotatedBeanDefinitionReader 初始化

public class AnnotatedBeanDefinitionReader {
    
    public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
        this.registry = registry;
        
        // 注册核心的 ConfigurationClassPostProcessor
        // 用于解析 @Configuration 类
        AnnotationConfigUtils.registerAnnotationConfigProcessors(registry);
    }
    
    /**
     * 注册配置类
     */
    public void register(Class<?>... componentClasses) {
        for (Class<?> componentClass : componentClasses) {
            registerBean(componentClass);
        }
    }
}

扫描流程

public class ClassPathBeanDefinitionScanner extends ClassPathScanningCandidateComponentProvider {
    
    /**
     * 扫描指定包
     */
    public int scan(String... basePackages) {
        // 1. 清空之前的 Bean 定义(如果需要)
        
        // 2. 扫描每个包
        for (String basePackage : basePackages) {
            // 2.1 查找候选组件
            Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
            
            // 2.2 解析并注册
            for (BeanDefinition candidate : candidates) {
                // 解析 Scope
                ScopeMetadata scopeMetadata = scopeMetadataResolver.resolveScopeMetadata(candidate);
                candidate.setScope(scopeMetadata.getScopeName());
                
                // 生成 Bean 名称
                String beanName = beanNameGenerator.generateBeanName(candidate, registry);
                
                // 处理通用注解(@Lazy、@Primary 等)
                if (candidate instanceof AbstractBeanDefinition) {
                    postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
                }
                
                // 注册 Bean 定义
                registry.registerBeanDefinition(beanName, candidate);
            }
        }
        
        return registry.getBeanDefinitionCount();
    }
    
    /**
     * 查找候选组件
     */
    public Set<BeanDefinition> findCandidateComponents(String basePackage) {
        Set<BeanDefinition> candidates = new LinkedHashSet<>();
        
        // 1. 组装扫描路径
        String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
            resolveBasePackage(basePackage) + '/' + resourcePattern;
        
        // 2. 获取所有资源
        Resource[] resources = resourcePatternResolver.getResources(packageSearchPath);
        
        for (Resource resource : resources) {
            if (resource.isReadable()) {
                // 3. 读取元数据
                MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
                
                // 4. 检查是否匹配过滤器(@Component 注解)
                if (isCandidateComponent(metadataReader)) {
                    // 5. 创建 ScannedGenericBeanDefinition
                    ScannedGenericBeanDefinition sbd = 
                        new ScannedGenericBeanDefinition(metadataReader);
                    sbd.setSource(resource);
                    
                    if (isCandidateComponent(sbd)) {
                        candidates.add(sbd);
                    }
                }
            }
        }
        
        return candidates;
    }
}

扫描过滤器配置

protected void registerDefaultFilters() {
    // 默认包含 @Component 注解的类
    addIncludeFilter(new AnnotationTypeFilter(Component.class));
    
    // 也包含 @Service、@Repository、@Controller
    // 因为它们都标注了 @Component 元注解
}

3.4 @Configuration 解析

@Configuration 解析发生在 refresh() 方法中

public void refresh() {
    // 1. 准备刷新
    prepareRefresh();
    
    // 2. 获取 BeanFactory
    ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    
    // 3. 准备 BeanFactory
    prepareBeanFactory(beanFactory);
    
    try {
        // 4. 后置处理 BeanFactory
        postProcessBeanFactory(beanFactory);
        
        // 5. 【关键】调用 BeanFactoryPostProcessors
        // 这里会调用 ConfigurationClassPostProcessor 解析 @Configuration
        invokeBeanFactoryPostProcessors(beanFactory);
        
        // 6. 注册 BeanPostProcessors
        registerBeanPostProcessors(beanFactory);
        
        // 7. 初始化 MessageSource
        initMessageSource();
        
        // 8. 初始化事件发布器
        initApplicationEventMulticaster();
        
        // 9. 初始化其他特殊 Bean
        onRefresh();
        
        // 10. 注册监听器
        registerListeners();
        
        // 11. 实例化所有非延迟单例 Bean
        finishBeanFactoryInitialization(beanFactory);
        
        // 12. 完成刷新
        finishRefresh();
    }
    // ...
}

ConfigurationClassPostProcessor 解析

public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor {
    
    /**
     * 处理 @Configuration 类
     */
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
        // 1. 获取所有候选配置类
        String[] candidateNames = registry.getBeanDefinitionNames();
        
        for (String beanName : candidateNames) {
            BeanDefinition beanDef = registry.getBeanDefinition(beanName);
            
            // 检查是否是配置类
            if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, metadataReaderFactory)) {
                // 解析配置类
                processConfigBeanDefinitions(registry);
            }
        }
    }
    
    /**
     * 解析配置类
     */
    public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
        // 1. 创建配置类解析器
        ConfigurationClassParser parser = new ConfigurationClassParser(...);
        
        // 2. 解析每个配置类
        for (String configName : candidateNames) {
            parser.parse(registry.getBeanDefinition(configName));
        }
        
        // 3. 获取解析结果
        Set<ConfigurationClass> configClasses = parser.getConfigurationClasses();
        
        // 4. 加载 Bean 定义
        this.reader.loadBeanDefinitions(configClasses);
    }
}

BeanDefinition 加载小结

方式核心类功能
XML 配置XmlBeanDefinitionReader解析 XML,注册 <bean> 定义的 Bean
组件扫描ClassPathBeanDefinitionScanner扫描 @Component 注解的类
配置类解析ConfigurationClassPostProcessor解析 @Configuration 类和 @Bean 方法

四、BeanDefinition 继承体系

4.1 元数据与属性访问

BeanDefinition 继承结构

BeanDefinition
    │
    ├── BeanMetadataElement(元数据元素)
    │       └── getSource():获取数据源
    │
    └── AttributeAccessor(属性访问器)
            ├── setAttribute(String, Object)
            ├── getAttribute(String)
            └── removeAttribute(String)

核心接口说明

BeanMetadataElement - 元数据元素
public interface BeanMetadataElement {
    /**
     * 获取配置源
     * @return 元数据对象(可能为 null)
     */
    @Nullable
    default Object getSource() {
        return null;
    }
}

作用:标识 Bean 的来源(哪个类、哪个配置文件等)

BeanMetadataAttribute - 元数据属性
public class BeanMetadataAttribute implements BeanMetadataElement {
    private final String name;   // 属性名
    @Nullable
    private final Object value;  // 属性值
    @Nullable
    private Object source;       // 数据源
}
AttributeAccessor - 属性访问器
public interface AttributeAccessor {
    /**
     * 设置属性
     */
    void setAttribute(String name, @Nullable Object value);
    
    /**
     * 获取属性
     */
    @Nullable
    Object getAttribute(String name);
    
    /**
     * 移除属性
     */
    @Nullable
    Object removeAttribute(String name);
    
    /**
     * 判断是否包含属性
     */
    boolean hasAttribute(String name);
    
    /**
     * 获取所有属性名
     */
    String[] attributeNames();
}

作用:给 Bean 定义附加额外属性(扩展性设计)

AttributeAccessorSupport - 属性访问抽象实现
public abstract class AttributeAccessorSupport implements AttributeAccessor, Serializable {
    /** 属性存储容器 */
    private final Map<String, Object> attributes = new LinkedHashMap<>();
    
    @Override
    public void setAttribute(String name, @Nullable Object value) {
        Assert.notNull(name, "Name must not be null");
        if (value != null) {
            this.attributes.put(name, value);
        } else {
            removeAttribute(name);
        }
    }
    
    @Override
    @Nullable
    public Object getAttribute(String name) {
        Assert.notNull(name, "Name must not be null");
        return this.attributes.get(name);
    }
    
    // ... 其他实现
}
BeanMetadataAttributeAccessor - 元数据属性访问器
public class BeanMetadataAttributeAccessor extends AttributeAccessorSupport 
    implements BeanMetadataElement {
    
    @Nullable
    private Object source;
    
    public void setSource(@Nullable Object source) {
        this.source = source;
    }
    
    @Override
    @Nullable
    public Object getSource() {
        return this.source;
    }
}

AbstractBeanDefinition 继承于它,使得同时具有属性访问和元数据访问功能。

继承关系图

BeanMetadataAttributeAccessor
    │
    ├── AttributeAccessorSupport(属性访问)
    │       └── Map<String, Object> attributes
    │
    └── BeanMetadataElement(元数据)
            └── Object source
                    │
                    ▼
            AbstractBeanDefinition
                    │
                    ├── GenericBeanDefinition
                    ├── RootBeanDefinition
                    ├── ScannedGenericBeanDefinition
                    ├── AnnotatedGenericBeanDefinition
                    └── ConfigurationClassBeanDefinition

4.2 核心实现类

BeanDefinition 继承体系

BeanDefinition
    │
    ├── AnnotatedBeanDefinition(带注解的 BeanDefinition)
    │       │
    │       ├── ScannedGenericBeanDefinition ← 扫描的 Bean
    │       ├── AnnotatedGenericBeanDefinition ← 注解注册的 Bean
    │       └── ConfigurationClassBeanDefinition ← @Configuration 的 Bean
    │
    └── AbstractBeanDefinition(抽象模板)
            │
            ├── GenericBeanDefinition(通用 BeanDefinition)
            ├── RootBeanDefinition(根 BeanDefinition,合并后的最终形态)
            └── ChildBeanDefinition(子 BeanDefinition,支持父子关系)

各实现类说明

实现类用途特点
GenericBeanDefinition通用 Bean 定义最常用的实现,支持设置父 Bean
RootBeanDefinition根 Bean 定义合并后的最终形态,内部使用
ScannedGenericBeanDefinition扫描的 Bean用于 @ComponentScan 扫描的类
AnnotatedGenericBeanDefinition注解注册的 Bean用于 register() 注册的类
ConfigurationClassBeanDefinition配置类 Bean用于 @Configuration@Bean
ChildBeanDefinition子 Bean 定义继承父 Bean 定义(已废弃)
AnnotatedBeanDefinition 接口
public interface AnnotatedBeanDefinition extends BeanDefinition {
    /**
     * 获取注解元数据
     */
    AnnotationMetadata getMetadata();
    
    /**
     * 获取工厂方法元数据(@Bean 方法)
     */
    @Nullable
    MethodMetadata getFactoryMethodMetadata();
}

作用:用于获取 Bean 所在类的注解信息,在解析处理时需要用到。

AbstractBeanDefinition 模板类

核心属性

public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
    implements BeanDefinition, Cloneable {
    
    // 作用域
    @Nullable
    private String scope = SCOPE_DEFAULT;
    
    // 是否为抽象
    private boolean abstractFlag = false;
    
    // 是否懒加载
    @Nullable
    private Boolean lazyInit;
    
    // 自动装配模式
    private int autowireMode = AUTOWIRE_NO;
    
    // 依赖检查
    private int dependencyCheck = DEPENDENCY_CHECK_NONE;
    
    // 依赖的 Bean
    @Nullable
    private String[] dependsOn;
    
    // 是否为主要候选者
    private boolean primary = false;
    
    // 构造参数
    @Nullable
    private ConstructorArgumentValues constructorArgumentValues;
    
    // 属性值
    @Nullable
    private MutablePropertyValues propertyValues;
    
    // 初始化方法
    @Nullable
    private String initMethodName;
    
    // 销毁方法
    @Nullable
    private String destroyMethodName;
    
    // 工厂 Bean 名称
    @Nullable
    private String factoryBeanName;
    
    // 工厂方法名称
    @Nullable
    private String factoryMethodName;
    
    // Bean 类
    @Nullable
    private volatile Object beanClass;
}

完整类图

┌─────────────────────────────────────────────────────────────────────┐
│                         BeanDefinition                               │
│  - getBeanClassName(): String                                       │
│  - getScope(): String                                               │
│  - isLazyInit(): boolean                                            │
│  - getConstructorArgumentValues(): ConstructorArgumentValues        │
│  - getPropertyValues(): MutablePropertyValues                       │
└─────────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────────┐
│                    AbstractBeanDefinition                            │
│  - scope: String                                                    │
│  - lazyInit: Boolean                                                │
│  - primary: boolean                                                 │
│  - constructorArgumentValues: ConstructorArgumentValues             │
│  - propertyValues: MutablePropertyValues                            │
│  - initMethodName: String                                           │
│  - destroyMethodName: String                                        │
│  - factoryBeanName: String                                          │
│  - factoryMethodName: String                                        │
└──────┬──────────────────────────────────────────────────────────────┘
       │
       ├── GenericBeanDefinition
       │      - parentName: String
       │
       ├── RootBeanDefinition
       │      - 用于合并后的最终 Bean 定义
       │      - 不支持设置父 Bean
       │
       ├── ScannedGenericBeanDefinition
       │      - metadata: AnnotationMetadata
       │      - 用于组件扫描
       │
       ├── AnnotatedGenericBeanDefinition
       │      - metadata: AnnotationMetadata
       │      - 用于注解注册
       │
       └── ConfigurationClassBeanDefinition
              - 用于 @Configuration 类
              - 用于 @Bean 方法

五、总结

核心知识点回顾

1. ApplicationContext 体系

  • 继承 BeanFactory,提供 IoC 容器基础功能
  • 扩展事件发布、资源加载、国际化等高级功能
  • 主要分支:可刷新的 AbstractRefreshableApplicationContext 和通用的 GenericApplicationContext

2. BeanFactory 实现

  • DefaultListableBeanFactory 是核心实现
  • 实现 BeanDefinitionRegistry 接口,管理 Bean 定义
  • 继承 AbstractAutowireCapableBeanFactory,支持自动装配

3. BeanDefinition 加载

  • XML 方式XmlBeanDefinitionReader 解析 XML 文件
  • 扫描方式ClassPathBeanDefinitionScanner 扫描 @Component
  • 配置类方式ConfigurationClassPostProcessor 解析 @Configuration@Bean

4. BeanDefinition 继承体系

  • AbstractBeanDefinition:模板类,提供通用属性
  • GenericBeanDefinition:通用实现,支持父子关系
  • RootBeanDefinition:合并后的最终形态
  • ScannedGenericBeanDefinition:扫描生成的 Bean 定义
  • AnnotatedBeanDefinition:接口,提供注解元数据访问

5. 设计亮点

  • 元数据与属性分离BeanMetadataElement + AttributeAccessor
  • 模板方法模式AbstractBeanDefinition 提供通用实现
  • 策略模式:不同类型的 BeanDefinition 应对不同场景

与手写框架的对比

功能手写框架Spring 源码
BeanDefinitionGenericBeanDefinitionGenericBeanDefinitionScannedGenericBeanDefinition 等多种实现
元数据简单实现BeanMetadataElementAnnotationMetadata 完整接口
属性访问AttributeAccessor 接口
XML 解析简单 DOM 解析XmlBeanDefinitionReader + BeanDefinitionDocumentReader
注解扫描简单扫描ClassPathBeanDefinitionScanner + ASM 元数据读取
配置类解析简单处理ConfigurationClassPostProcessor 完整解析流程

学习建议

  1. 阅读源码:重点阅读 DefaultListableBeanFactoryAbstractApplicationContextConfigurationClassPostProcessor
  2. 调试跟踪:通过断点调试 Bean 的加载过程
  3. 思考问题
    • 为什么需要多种 BeanDefinition 实现?
    • RootBeanDefinition 和 GenericBeanDefinition 的区别是什么?
    • Spring 是如何处理循环依赖的 Bean 定义注册的?
  4. 扩展练习
    • 实现自己的 BeanDefinition 扩展
    • 实现自定义的配置解析器

相关资源

  • Spring Core 文档:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html
  • Spring 源码:https://github.com/spring-projects/spring-framework
  • Spring 中文文档:https://github.com/DocsHome/spring-docs

如果本文对你有帮助,欢迎点赞、收藏、关注!如有疑问,欢迎在评论区留言讨论。

关键词:Spring 源码, ApplicationContext, BeanFactory, BeanDefinition, 注解配置, XML 配置, 组件扫描, 元数据, 属性访问


本文是 Spring 源码分析系列第一篇,深入分析了 ApplicationContext 体系结构和 BeanDefinition 加载原理。敬请期待后续文章…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

加倍巴巴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值