BeanFactory
BeanFactory 是 Spring 框架中最基础、最核心的接口之一,它提供了 IoC(控制反转)容器的基本功能。BeanFactory 负责管理应用程序中的各种组件(Bean),包括它们的配置、创建、装配和管理。
下面是 BeanFactory 的一些重要特点和功能:
- Bean 定义 BeanFactory 通过 BeanDefinition 来管理 Bean 的定义,BeanDefinition 中包含了 Bean 的类名、依赖关系、初始化方法、销毁方法等配置信息。这些信息通常是通过 XML 配置文件或注解方式进行配置的。
- 延迟初始化 BeanFactory 支持延迟初始化,即在真正需要使用 Bean 的时候才进行初始化。这样可以节省系统资源,并提高性能。
- Bean 实例化 BeanFactory 负责根据配置信息来实例化 Bean 对象,并管理它们的生命周期。可以根据需要创建单例、原型等不同类型的 Bean。
- 依赖注入 BeanFactory 实现了依赖注入,即管理 Bean 之间的依赖关系。它会自动将依赖的 Bean 注入到目标 Bean 中,从而实现解耦和灵活性。
- AOP 支持 BeanFactory 支持 AOP(面向切面编程),可以通过配置来实现切面、通知等功能,从而实现对应用程序的横切关注点的管理。
- 国际化支持 BeanFactory 提供了国际化的支持,可以方便地实现应用程序的国际化和本地化。
Spring 框架提供了多个 BeanFactory 的实现类,包括 XmlBeanFactory、DefaultListableBeanFactory 等。在实际开发中,通常会使用 ApplicationContext 接口及其实现类,例如 ClassPathXmlApplicationContext、AnnotationConfigApplicationContext 等,因为它们提供了更多的功能和特性,但它们都是以 BeanFactory 为基础构建的。
BeanFactory 体系
BeanFactory
:Spring 体系最底层工厂接口,定义工厂的基本操作。HierarchicalBeanFactory
:主要用于父子工厂的管理。可以在 Spring 上下文中创建一个层次结构,使得每个层次都可以有自己的 Bean 定义,同时还可以访问父级工厂中定义的 Bean。ConfigurableBeanFactory
:可以在 Spring 应用中更灵活地配置和管理 Bean 工厂的行为,例如需要对 Bean 的作用域、类加载器、自动装配等方面进行更精细的控制。AutowireCapableBeanFactory
:允许在运行时动态地进行 Bean 的创建和自动装配。ListableBeanFactory
:提供了对容器中所有 Bean 的一些基本信息的检索功能,使得开发者可以方便地查找、遍历和操作容器中的 Bean。DefaultListableBeanFactory
:较为高级的工厂,Spring 容器的核心组成部分之一,它实现了 BeanFactory 接口及其子接口,提供了对 Bean 的注册、实例化和依赖注入等核心功能的实现。在 Spring 应用程序中,当我们使用注解或XML配置定义 Bean 时,底层容器就会使用 DefaultListableBeanFactory 进行相应的管理和处理。XmlBeanFactory
:在旧版本的 Spring 中曾经是用于从 XML 配置文件中加载 Bean 定义的一个类(配合工具类 XmlBeanDefinitionReader),但需要注意的是,它在较新版本的 Spring 中已经被废弃,并推荐使用 ApplicationContext 的实现类,比如 ClassPathXmlApplicationContext 或 FileSystemXmlApplicationContext 等。SimpleJndiBeanFactory
:是 BeanFactory接口基于 JNDI(访问命名和目录服务) 的简单实现。可以在分布式环境中查找和访问各种命名服务(数据库、消息队列等)的标准方式。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。