一、BeanFactory和BeanRegistry
两个重要的接口:
BeanFactory 和 BeanRegistry 是 Spring IoC 容器中的两个核心接口,它们涉及 Spring 容器的对象管理和配置,但它们的功能和作用有所不同。下面是对这两个接口的详细解释。
- BeanFactory
BeanFactory 是 Spring 框架中最基础的容器接口,它定义了 Spring 容器的核心功能。所有的 Spring 容器都实现了 BeanFactory 接口。这个接口主要负责 Bean 的管理和提供依赖注入(DI)功能。Spring 允许通过 BeanFactory 从容器中获取 Bean 对象,并自动处理 Bean 的依赖关系。
主要功能和作用:
• 创建和管理 Bean: BeanFactory 的核心作用是创建和管理对象(Bean)。它负责根据配置的定义实例化和初始化 Bean。
• 依赖注入: BeanFactory 会自动管理 Bean 之间的依赖关系,并在需要时注入其他依赖的 Bean。
• 惰性初始化(懒加载): BeanFactory 支持懒加载机制,即当某个 Bean 第一次被请求时,容器才会创建这个 Bean。与 ApplicationContext 不同,ApplicationContext 会在启动时就实例化所有的 Bean。
• 获取 Bean 的方法:
• getBean(String name):根据 Bean 名称获取实例。
• getBean(Class requiredType):根据类型获取实例。
• 生命周期管理: BeanFactory 负责管理 Bean 的生命周期,包括创建、初始化、销毁等过程。
常见实现:
• XmlBeanFactory(已过时,不推荐使用):最早的 BeanFactory 实现,基于 XML 配置文件。
• DefaultListableBeanFactory:目前最常用的 BeanFactory 实现,支持注解配置、XML 配置以及 Java 配置。
示例:
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
MyBean myBean = (MyBean) beanFactory.getBean("myBean");
- BeanRegistry
BeanRegistry 是 Spring 容器的另一个接口,负责管理和注册 Bean 的定义。在 Spring 中,BeanRegistry 是用于注册 Bean 的接口,它定义了如何向容器注册 Bean 定义。这个接口并不负责创建 Bean,它的作用是将 Bean 定义保存在容器中,并允许获取这些 Bean 定义。
主要功能和作用:
• 注册 Bean 定义: BeanRegistry 的主要作用是提供注册和管理 Bean 定义的方法。当用户将 Bean 定义传递给容器时,BeanRegistry 会将这些定义存储起来,供后续使用。
• Bean 定义的管理: 它管理 BeanDefinition(即 Bean 的配置和定义)。这些定义包含了 Bean 的类型、作用域、构造函数参数、依赖关系等信息。
• 定义 Bean 的作用: BeanRegistry 主要关注的是容器中 Bean 的元数据和管理,而不涉及 Bean 的实例化。它通常用于需要对 Bean 进行更精细控制的场景。
• 提供 registerBeanDefinition 方法: 用于将新的 Bean 定义注册到容器中。
示例:
// 示例代码说明如何使用 BeanRegistry 注册 Bean
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(MyBean.class);
beanRegistry.registerBeanDefinition("myBean", beanDefinition);
常见实现:
• DefaultListableBeanFactory:DefaultListableBeanFactory 是 Spring 容器的一个实现,既实现了 BeanFactory,也实现了 BeanRegistry。这个实现管理了容器中的所有 Bean 定义,并提供对这些定义的访问。
• GenericWebApplicationContext:在 Web 应用中,Spring 使用 GenericWebApplicationContext 来管理和注册 Bean 定义。
BeanFactory 和 BeanRegistry 的区别
特性 BeanFactory BeanRegistry
作用 负责 Bean 的实例化、依赖注入和生命周期管理。 负责注册和管理 Bean 的定义,不涉及 Bean 实例化。
功能 提供获取 Bean、依赖注入、惰性加载等功能。 提供 Bean 注册和管理 Bean 定义的功能。
接口方法 getBean(), containsBean(), getBeanDefinitionNames() 等方法。 registerBeanDefinition(), getBeanDefinition(), getBeansOfType() 等方法。
创建 Bean 创建并返回 Bean 实例。 不直接创建 Bean,只是注册 Bean 定义。
容器实现 XmlBeanFactory, DefaultListableBeanFactory 等。 DefaultListableBeanFactory 等。
总结
• BeanFactory 是一个容器接口,专注于 Bean 的实例化、依赖注入和生命周期管理。它是 Spring 容器的核心接口,负责管理 Bean 的创建和提供依赖注入。
• BeanRegistry 是一个用于注册 Bean 定义的接口,负责将 Bean 的元数据(如 Bean 类型、构造参数等)注册到容器中。它通常用于实现对 Bean 定义的精细控制。
在实际应用中,DefaultListableBeanFactory 实现了这两个接口,负责同时管理 Bean 的实例化和定义。因此,Spring 容器既是一个 BeanFactory,又是一个 BeanRegistry,能够有效地管理 Bean 的创建、依赖注入和定义管理。
二、Bean Definition
主要是各种Bean对象及其相互的关系
Bean对象存在依赖嵌套等关系,所以设计者设计了BeanDefinition,它用来对Bean对象及关系定义;我们在理解时只需要抓住如下三个要点:
BeanDefinition 定义了各种Bean对象及其相互的关系
BeanDefinitionReader 这是BeanDefinition的解析器
BeanDefinitionHolder 这是BeanDefination的包装类,用来存储BeanDefinition,name以及aliases等。
总结:BeanDefinition 是 Spring 容器中的一个关键概念,它是容器管理 Bean 的配置信息的核心。每个 Bean 都有一个对应的 BeanDefinition,包含了有关 Bean 的各种配置信息,如 Bean 的类型、作用域、构造参数、属性值、生命周期方法等。通过 BeanDefinition,Spring 容器能够灵活地管理和配置 Bean,实现依赖注入、懒加载、自动装配等功能。
三、ApplicationContext
在 Spring 框架中,ApplicationContext 是 IoC 容器的核心接口,它提供了访问 Spring 容器中的所有 Bean 的功能,并且包含了对 Spring 容器的更多功能扩展。ApplicationContext 是 BeanFactory 的一个子接口,除了具备 BeanFactory 的基本功能外,还提供了更多的功能,如国际化支持、事件发布、AOP、和应用层面的配置功能等。


一、BeanFactory和BeanRegistry
两个重要的接口:
BeanFactory 和 BeanRegistry 是 Spring IoC 容器中的两个核心接口,它们涉及 Spring 容器的对象管理和配置,但它们的功能和作用有所不同。下面是对这两个接口的详细解释。
BeanFactory 是 Spring 框架中最基础的容器接口,它定义了 Spring 容器的核心功能。所有的 Spring 容器都实现了 BeanFactory 接口。这个接口主要负责 Bean 的管理和提供依赖注入(DI)功能。Spring 允许通过 BeanFactory 从容器中获取 Bean 对象,并自动处理 Bean 的依赖关系。
主要功能和作用:
• 创建和管理 Bean: BeanFactory 的核心作用是创建和管理对象(Bean)。它负责根据配置的定义实例化和初始化 Bean。
• 依赖注入: BeanFactory 会自动管理 Bean 之间的依赖关系,并在需要时注入其他依赖的 Bean。
• 惰性初始化(懒加载): BeanFactory 支持懒加载机制,即当某个 Bean 第一次被请求时,容器才会创建这个 Bean。与 ApplicationContext 不同,ApplicationContext 会在启动时就实例化所有的 Bean。
• 获取 Bean 的方法:
• getBean(String name):根据 Bean 名称获取实例。
• getBean(Class requiredType):根据类型获取实例。
• 生命周期管理: BeanFactory 负责管理 Bean 的生命周期,包括创建、初始化、销毁等过程。
常见实现:
• XmlBeanFactory(已过时,不推荐使用):最早的 BeanFactory 实现,基于 XML 配置文件。
• DefaultListableBeanFactory:目前最常用的 BeanFactory 实现,支持注解配置、XML 配置以及 Java 配置。
示例:
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
MyBean myBean = (MyBean) beanFactory.getBean("myBean");
BeanRegistry 是 Spring 容器的另一个接口,负责管理和注册 Bean 的定义。在 Spring 中,BeanRegistry 是用于注册 Bean 的接口,它定义了如何向容器注册 Bean 定义。这个接口并不负责创建 Bean,它的作用是将 Bean 定义保存在容器中,并允许获取这些 Bean 定义。
主要功能和作用:
• 注册 Bean 定义: BeanRegistry 的主要作用是提供注册和管理 Bean 定义的方法。当用户将 Bean 定义传递给容器时,BeanRegistry 会将这些定义存储起来,供后续使用。
• Bean 定义的管理: 它管理 BeanDefinition(即 Bean 的配置和定义)。这些定义包含了 Bean 的类型、作用域、构造函数参数、依赖关系等信息。
• 定义 Bean 的作用: BeanRegistry 主要关注的是容器中 Bean 的元数据和管理,而不涉及 Bean 的实例化。它通常用于需要对 Bean 进行更精细控制的场景。
• 提供 registerBeanDefinition 方法: 用于将新的 Bean 定义注册到容器中。
示例:
// 示例代码说明如何使用 BeanRegistry 注册 Bean
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(MyBean.class);
beanRegistry.registerBeanDefinition("myBean", beanDefinition);
常见实现:
• DefaultListableBeanFactory:DefaultListableBeanFactory 是 Spring 容器的一个实现,既实现了 BeanFactory,也实现了 BeanRegistry。这个实现管理了容器中的所有 Bean 定义,并提供对这些定义的访问。
• GenericWebApplicationContext:在 Web 应用中,Spring 使用 GenericWebApplicationContext 来管理和注册 Bean 定义。
BeanFactory 和 BeanRegistry 的区别
特性 BeanFactory BeanRegistry
作用 负责 Bean 的实例化、依赖注入和生命周期管理。 负责注册和管理 Bean 的定义,不涉及 Bean 实例化。
功能 提供获取 Bean、依赖注入、惰性加载等功能。 提供 Bean 注册和管理 Bean 定义的功能。
接口方法 getBean(), containsBean(), getBeanDefinitionNames() 等方法。 registerBeanDefinition(), getBeanDefinition(), getBeansOfType() 等方法。
创建 Bean 创建并返回 Bean 实例。 不直接创建 Bean,只是注册 Bean 定义。
容器实现 XmlBeanFactory, DefaultListableBeanFactory 等。 DefaultListableBeanFactory 等。
总结
• BeanFactory 是一个容器接口,专注于 Bean 的实例化、依赖注入和生命周期管理。它是 Spring 容器的核心接口,负责管理 Bean 的创建和提供依赖注入。
• BeanRegistry 是一个用于注册 Bean 定义的接口,负责将 Bean 的元数据(如 Bean 类型、构造参数等)注册到容器中。它通常用于实现对 Bean 定义的精细控制。
在实际应用中,DefaultListableBeanFactory 实现了这两个接口,负责同时管理 Bean 的实例化和定义。因此,Spring 容器既是一个 BeanFactory,又是一个 BeanRegistry,能够有效地管理 Bean 的创建、依赖注入和定义管理。
二、Bean Definition
主要是各种Bean对象及其相互的关系
Bean对象存在依赖嵌套等关系,所以设计者设计了BeanDefinition,它用来对Bean对象及关系定义;我们在理解时只需要抓住如下三个要点:
BeanDefinition 定义了各种Bean对象及其相互的关系
BeanDefinitionReader 这是BeanDefinition的解析器
BeanDefinitionHolder 这是BeanDefination的包装类,用来存储BeanDefinition,name以及aliases等。
总结:BeanDefinition 是 Spring 容器中的一个关键概念,它是容器管理 Bean 的配置信息的核心。每个 Bean 都有一个对应的 BeanDefinition,包含了有关 Bean 的各种配置信息,如 Bean 的类型、作用域、构造参数、属性值、生命周期方法等。通过 BeanDefinition,Spring 容器能够灵活地管理和配置 Bean,实现依赖注入、懒加载、自动装配等功能。
三、ApplicationContext

在 Spring 框架中,ApplicationContext 是 IoC 容器的核心接口,它提供了访问 Spring 容器中的所有 Bean 的功能,并且包含了对 Spring 容器的更多功能扩展。ApplicationContext 是 BeanFactory 的一个子接口,除了具备 BeanFactory 的基本功能外,还提供了更多的功能,如国际化支持、事件发布、AOP、和应用层面的配置功能等。