Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Bean工厂探秘:解析Spring底层工厂体系BeanFactory的神奇之道

BeanFactory

BeanFactory 是 Spring 框架中最基础、最核心的接口之一,它提供了 IoC(控制反转)容器的基本功能。BeanFactory 负责管理应用程序中的各种组件(Bean),包括它们的配置、创建、装配和管理。

下面是 BeanFactory 的一些重要特点和功能:

  1. Bean 定义 BeanFactory 通过 BeanDefinition 来管理 Bean 的定义,BeanDefinition 中包含了 Bean 的类名、依赖关系、初始化方法、销毁方法等配置信息。这些信息通常是通过 XML 配置文件或注解方式进行配置的。
  2. 延迟初始化 BeanFactory 支持延迟初始化,即在真正需要使用 Bean 的时候才进行初始化。这样可以节省系统资源,并提高性能。
  3. Bean 实例化 BeanFactory 负责根据配置信息来实例化 Bean 对象,并管理它们的生命周期。可以根据需要创建单例、原型等不同类型的 Bean。
  4. 依赖注入 BeanFactory 实现了依赖注入,即管理 Bean 之间的依赖关系。它会自动将依赖的 Bean 注入到目标 Bean 中,从而实现解耦和灵活性。
  5. AOP 支持 BeanFactory 支持 AOP(面向切面编程),可以通过配置来实现切面、通知等功能,从而实现对应用程序的横切关注点的管理。
  6. 国际化支持 BeanFactory 提供了国际化的支持,可以方便地实现应用程序的国际化和本地化。

Spring 框架提供了多个 BeanFactory 的实现类,包括 XmlBeanFactory、DefaultListableBeanFactory 等。在实际开发中,通常会使用 ApplicationContext 接口及其实现类,例如 ClassPathXmlApplicationContext、AnnotationConfigApplicationContext 等,因为它们提供了更多的功能和特性,但它们都是以 BeanFactory 为基础构建的。

BeanFactory 体系

  1. BeanFactory:Spring 体系最底层工厂接口,定义工厂的基本操作。
  2. HierarchicalBeanFactory:主要用于父子工厂的管理。可以在 Spring 上下文中创建一个层次结构,使得每个层次都可以有自己的 Bean 定义,同时还可以访问父级工厂中定义的 Bean。
  3. ConfigurableBeanFactory:可以在 Spring 应用中更灵活地配置和管理 Bean 工厂的行为,例如需要对 Bean 的作用域、类加载器、自动装配等方面进行更精细的控制。
  4. AutowireCapableBeanFactory:允许在运行时动态地进行 Bean 的创建和自动装配。
  5. ListableBeanFactory:提供了对容器中所有 Bean 的一些基本信息的检索功能,使得开发者可以方便地查找、遍历和操作容器中的 Bean。
  6. DefaultListableBeanFactory:较为高级的工厂,Spring 容器的核心组成部分之一,它实现了 BeanFactory 接口及其子接口,提供了对 Bean 的注册、实例化和依赖注入等核心功能的实现。在 Spring 应用程序中,当我们使用注解或XML配置定义 Bean 时,底层容器就会使用 DefaultListableBeanFactory 进行相应的管理和处理。
  7. XmlBeanFactory:在旧版本的 Spring 中曾经是用于从 XML 配置文件中加载 Bean 定义的一个类(配合工具类 XmlBeanDefinitionReader),但需要注意的是,它在较新版本的 Spring 中已经被废弃,并推荐使用 ApplicationContext 的实现类,比如 ClassPathXmlApplicationContext 或 FileSystemXmlApplicationContext 等。
  8. SimpleJndiBeanFactory:是 BeanFactory接口基于 JNDI(访问命名和目录服务) 的简单实现。可以在分布式环境中查找和访问各种命名服务(数据库、消息队列等)的标准方式。
  9. ApplicationContext:Spring 的 高级工厂、核心容器,用于管理和组织应用程序的组件,负责加载、配置和管理Bean的生命周期,它可以从多种来源(如XML文件、注解、Java配置等)读取配置信息,并根据配置信息创建和管理Bean对象。

最强大的两个工厂:DefaultListableBeanFactory 和 ApplicationContext,均集成了上述主要工厂的核心能力!

XmlBeanFactory

在源码学习的时候可以跟踪 XmlBeanFactory 的运行流程,因为它继承了 DefaultListableBeanFactory 这个高级工厂~

使用方法如下:

public class XmlBeanFactoryTest {
    private BeanFactory factory;
    @Before
    public void before() {
        // 指定配置文件,创建 Spring 工厂
        factory = new XmlBeanFactory(new ClassPathResource("/applicationContext.xml"));
    }
    /**
     * 通过 Spring 的工厂获得对象
     */
    @Test
    public void testGetBean() {
        User user = (User) factory.getBean("user");
        System.out.println(user);
    }
}

读取配置文件时使用 ClassPathResource 类,读取类路径下相关资源文件的内容(applicationContext.xml),获得输入流封装为 Java 的对象 BeanDefinition,对应配置文件中一个个的 标签。

Spring 中使用的 XML 解析技术使用的是 SAX,而不是 XPath。


相关文章
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2
|
21天前
|
搜索推荐 Java Spring
Spring Filter深度解析
【10月更文挑战第21天】Spring Filter 是 Spring 框架中非常重要的一部分,它为请求处理提供了灵活的控制和扩展机制。通过合理配置和使用 Filter,可以实现各种个性化的功能,提升应用的安全性、可靠性和性能。还可以结合具体的代码示例和实际应用案例,进一步深入探讨 Spring Filter 的具体应用和优化技巧,使对它的理解更加全面和深入。
|
10天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
28天前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
107 5
|
30天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
65 0
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
162 2
|
8天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
19 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
4天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
14 2

推荐镜像

更多