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,对应配置文件中一个个的 <bean> 标签。

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