Spring 中 BeanFactory 与 ApplicationContext 的深度解析

Spring 为我们提供了两种核心的容器抽象形式:

  • BeanFactory
  • ApplicationContext

值得注意的是,这些都是接口,而非具体的实现类。它们代表了容器能力中两个不同的层级。下面让我们来看看 BeanFactory 接口和 ApplicationContext 接口的层级结构,以及它们的一些实现类。

Interface Hierarchy

  • BeanFactory 是根接口
  • ApplicationContext 继承了 BeanFactory
  • XmlBeanFactory 实现了 BeanFactory(已废弃)
  • ClassPathXmlApplicationContext、FileSystemXmlApplicationContext 等实现了 ApplicationContext

这也就解释了为什么我们在讨论 Spring 时,总是对比 BeanFactory 和 ApplicationContext 这两个接口,而不是针对具体的实现类进行比较。

1. BeanFactory:

BeanFactory 定义在 org.springframework.beans.factory 包中,它是 Spring 中基础的控制反转容器。它为我们提供了 bean 创建和依赖注入等核心功能。

核心特性:

  • 只有在请求时才创建 Bean
  • 这种行为被称为延迟初始化
  • 适用于轻量级或内存受限的应用程序

声明方式:

ClassPathResource resource = new ClassPathResource("beans.xml"); 
XmlBeanFactory factory = new XmlBeanFactory(resource);

> 注意:

>

> – INLINECODE0838943eINLINECODEbb3fb9d7

> – 上述示例仅用于演示延迟初始化的行为。

> – BeanFactory 接口本身并未被废弃,但在现代应用程序中很少直接使用。

> – 在实际应用开发中,我们通常优先选择 ApplicationContext。

使用 BeanFactory 的示例(体验延迟初始化)

第 1 步: Bean 类

public class WelcomeBean {

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String welcomeMsg() {
        return "Welcome " + name;
    }

    public void init() {
        System.out.println("Welcome Bean is initialized!!");
    }

    public void destroy() {
        System.out.println("Welcome Bean is destroyed!!");
    }
}

第 2 步: XML 配置



    
        
    


第 3 步: 测试类

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class WelcomeBeanTest {

    public static void main(String[] args) {

        ClassPathResource resource = new ClassPathResource("beans.xml");
        XmlBeanFactory factory = new XmlBeanFactory(resource);

        System.out.println("Before getBean() method");

        WelcomeBean bean = (WelcomeBean) factory.getBean("welcomeBean");
        System.out.println(bean.welcomeMsg());

        factory.destroySingletons();
    }
}

输出结果:
解释说明:

  • Bean 在容器启动时并未被初始化
  • 只有在调用 getBean() 方法时,初始化才会发生
  • 这种行为正是我们所说的延迟初始化
  • XmlBeanFactory 已被废弃,此处仅用于演示目的

功能特性详解

1. BeanFactory 中的自动装配

  • 主要依赖基于 XML 的配置
  • 支持 autowire 属性
  • 默认情况下不启用基于注解的自动装配

2. BeanFactory 中的后置处理器处理

  • BeanPostProcessor 和 BeanFactoryPostProcessor 必须手动注册
  • BeanFactory 不会自动检测这些后置处理器

3. Bean 初始化示例(延迟初始化)
行为分析:

  • 只有当调用 getBean() 时,Bean 才会被初始化
  • 初始化是按需进行的

执行结果:

  • 初始化消息会出现在 getBean() 调用之后
  • 这证实了延迟初始化的行为模式

2. ApplicationContext:

ApplicationContext 定义在 org.springframework.context 包中,它是一个高级容器,继承自 BeanFactory,并提供了额外的企业级功能。

核心特性:

  • 急切实例化(默认行为):容器启动时即创建所有 Bean
  • 基于注解的配置支持
  • 事件处理机制
  • 国际化支持(i18n)
  • 自动注册后置处理器

声明方式:

“`java

Applic

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/18676.html
点赞
0.00 平均评分 (0% 分数) - 0