深度解析 Spring 源码:揭秘 BeanFactory 之谜

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 深度解析 Spring 源码:揭秘 BeanFactory 之谜

深度解析 Spring 源码:揭秘 BeanFactory 之谜

 

`BeanFactory` 是 Spring 框架的核心接口之一,用于管理和配置应用中的 Bean。它提供了一种统一的方式来访问应用程序组件,并管理这些组件的生命周期。理解 `BeanFactory` 及其相关实现类对于深入掌握 Spring 容器的工作机制至关重要。

 

1. BeanFactory 的概述

 

`BeanFactory` 是一个简单的 IOC(Inversion of Control)容器,负责实例化、配置和管理 Bean。它是所有 Spring 容器的基础接口,定义了最基本的 Bean 管理操作。

 

主要功能包括:

- 实例化和获取 Bean

- 管理 Bean 的生命周期

- 处理 Bean 之间的依赖关系

 

2. BeanFactory 的层次结构

 

Spring 提供了多种 `BeanFactory` 的实现,满足不同的使用场景。主要的子接口和实现类包括:

 

- **ListableBeanFactory**: 扩展了 `BeanFactory`,增加了按类型或其他标准批量查找 Bean 的能力。

- **HierarchicalBeanFactory**: 增加了父子级别的 BeanFactory 支持。

- **ConfigurableBeanFactory**: 提供了配置 BeanFactory 的方法,以及注册 Bean 处理器和作用域的支持。

- **DefaultListableBeanFactory**: 常用的具体实现类,结合了 `ListableBeanFactory` 和 `ConfigurableBeanFactory` 的功能。

 

3. BeanFactory 接口源码

 

以下是 `BeanFactory` 接口的简化版源码:

 

```java
public interface BeanFactory {
 
    // 按名称获取 Bean
    Object getBean(String name) throws BeansException;
 
    // 按名称和类型获取 Bean
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
 
    // 按类型获取 Bean
    <T> T getBean(Class<T> requiredType) throws BeansException;
 
    // 按名称和构造函数参数获取 Bean
    Object getBean(String name, Object... args) throws BeansException;
 
    // 检查是否包含指定名称的 Bean
    boolean containsBean(String name);
 
    // 判断指定名称的 Bean 是否为单例
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
 
    // 判断指定名称的 Bean 是否为原型
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
 
    // 获取指定名称的 Bean 的类型
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
}
```

 

4. DefaultListableBeanFactory 类

 

`DefaultListableBeanFactory` 是 Spring 中最常用的 `BeanFactory` 实现类,它结合了多个接口的功能,提供了强大的 Bean 管理能力。以下是 `DefaultListableBeanFactory` 类的一些关键代码:

 

```java
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
                                        implements ConfigurableListableBeanFactory,
                                                   BeanDefinitionRegistry {
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
 
    @Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException {
        Assert.hasText(beanName, "Bean name must not be empty");
        Assert.notNull(beanDefinition, "BeanDefinition must not be null");
 
        this.beanDefinitionMap.put(beanName, beanDefinition);
    }
 
    @Override
    public Object getBean(String name) throws BeansException {
        return doGetBean(name, null, null, false);
    }
 
    @Override
    public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
        return requiredType.cast(getBean(name));
    }
 
    @Override
    public <T> T getBean(Class<T> requiredType) throws BeansException {
        String[] beanNames = getBeanNamesForType(requiredType);
        if (beanNames.length > 1) {
            throw new NoUniqueBeanDefinitionException(requiredType, beanNames);
        }
        return getBean(beanNames[0], requiredType);
    }
 
    @Override
    public boolean containsBean(String name) {
        return containsBeanDefinition(name) || super.containsSingleton(name);
    }
 
    @Override
    public boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        BeanDefinition bd = getBeanDefinition(name);
        return bd.isSingleton();
    }
 
    @Override
    public boolean isPrototype(String name) throws NoSuchBeanDefinitionException {
        BeanDefinition bd = getBeanDefinition(name);
        return bd.isPrototype();
    }
 
    @Override
    @Nullable
    public Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        BeanDefinition bd = getBeanDefinition(name);
        return bd.getBeanClass();
    }
}
```

 

5. BeanFactory 的使用

 

5.1 通过 XML 配置文件使用 BeanFactory

 

在 XML 配置文件中定义 Bean,然后通过 `XmlBeanFactory` 加载配置文件并获取 Bean:

 

```xml
<beans>
    <bean id="exampleBean" class="com.example.MyClass">
        <property name="name" value="example"/>
    </bean>
</beans>
```
 
```java
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
MyClass myClass = factory.getBean("exampleBean", MyClass.class);
```

 

5.2 通过注解配置使用 ApplicationContext

 

虽然 `ApplicationContext` 是 `BeanFactory` 的子接口,但它提供了更多高级功能,如事件发布、国际化等。我们通常使用 `AnnotationConfigApplicationContext` 来加载注解配置:

 

```java
@Configuration
public class AppConfig {
    @Bean
    public MyClass exampleBean() {
        return new MyClass("example");
    }
}
 
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyClass myClass = context.getBean(MyClass.class);
```

 

6. 总结

 

`BeanFactory` 是 Spring 容器的核心接口,负责 Bean 的创建、管理和生命周期控制。通过对 `BeanFactory` 及其实现类的深入理解,我们可以了解 Spring 容器如何高效地管理应用程序中的组件。无论是简单的 `BeanFactory` 还是功能更丰富的 `ApplicationContext`,它们都基于相同的核心理念,为开发者提供了一致且强大的依赖注入和组件管理机制。

目录
相关文章
|
11天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
11天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
11天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
11天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
57 12
|
30天前
|
PyTorch Shell API
Ascend Extension for PyTorch的源码解析
本文介绍了Ascend对PyTorch代码的适配过程,包括源码下载、编译步骤及常见问题,详细解析了torch-npu编译后的文件结构和三种实现昇腾NPU算子调用的方式:通过torch的register方式、定义算子方式和API重定向映射方式。这对于开发者理解和使用Ascend平台上的PyTorch具有重要指导意义。
|
1月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
54 2
|
12天前
|
安全 搜索推荐 数据挖掘
陪玩系统源码开发流程解析,成品陪玩系统源码的优点
我们自主开发的多客陪玩系统源码,整合了市面上主流陪玩APP功能,支持二次开发。该系统适用于线上游戏陪玩、语音视频聊天、心理咨询等场景,提供用户注册管理、陪玩者资料库、预约匹配、实时通讯、支付结算、安全隐私保护、客户服务及数据分析等功能,打造综合性社交平台。随着互联网技术发展,陪玩系统正成为游戏爱好者的新宠,改变游戏体验并带来新的商业模式。
|
2月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
142 2
|
2月前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
58 2

推荐镜像

更多