BeanFactory 和ApplicationContext(Bean工厂和应用上下文)

本文详细解析Spring框架的核心组件BeanFactory和其扩展 ApplicationContext 的区别与用途,包括它们的类体系结构、功能特性及初始化过程。通过示例代码展示了如何创建不同类型的ApplicationContext实例,并强调了ApplicationContext在实际应用中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、BeanFactory 和ApplicationContext 
Bean 工厂(com.springframework.beans.factory.BeanFactory)是Spring 框架最核心的接口,它提供了高级IoC 的配置机制。
应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory 基础之上。
几乎所有的应用场合我们都直接使用ApplicationContext 而非底层的BeanFactory。

1.1 BeanFactory 的类体系结构

BeanFactory 接口位于类结构树的顶端, 它最主要的方法就是getBean(StringbeanName),该方法从容器中返回特定名称的Bean,BeanFactory 的功能通过其他的接口得到不断扩展。
    ListableBeanFactory:该接口定义了访问容器中Bean 基本信息的若干方法,如查看Bean 的个数、获取某一类型Bean 的配置名、查看容器中是否包括某一Bean 等方法;
    HierarchicalBeanFactory:父子级联IoC 容器的接口,子容器可以通过接口方法访问父容器;
    ConfigurableBeanFactory:是一个重要的接口,增强了IoC 容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法;
    AutowireCapableBeanFactory:定义了将容器中的Bean 按某种规则(如按名字匹配、按类型匹配等)进行自动装配的方法;
    SingletonBeanRegistry:定义了允许在运行期间向容器注册单实例Bean 的方法;
    BeanDefinitionRegistry:Spring 配置文件中每一个<bean>节点元素在Spring 容器里都通过一个BeanDefinition 对象表示,它描述了Bean 的配置信息。而BeanDefinitionRegistry 接口提供了向容器手工注册BeanDefinition 对象的方法。

 

1.2 ApplicationContext 的类体系结构

ApplicationContext 由BeanFactory 派生而来,提供了更多面向实际应用的功能。在BeanFactory 中,很多功能需要以编程的方式实现,而在ApplicationContext 中则可以通过配置的方式实现。
    ApplicationContext 的主要实现类是ClassPathXmlApplicationContext 和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件。

核心接口包括:
    ApplicationEventPublisher:让容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等。实现了 ApplicationListener 事件监听接口的Bean 可以接收到容器事件, 并对事件进行响应处理。在ApplicationContext 抽象实现类AbstractApplicationContext 中,我们可以发现存在一个ApplicationEventMulticaster,它负责保存所有监听器,以便在容器产生上下文事件时通知这些事件监听 者。
    MessageSource:为应用提供i18n 国际化消息访问的功能;
    ResourcePatternResolver : 所有ApplicationContext 实现类都实现了类似于
PathMatchingResourcePatternResolver 的功能,可以通过带前缀的Ant 风格的资源文
件路径装载Spring 的配置文件。
    LifeCycle:该接口是Spring 2.0 加入的,该接口提供了start()和stop()两个方法,主要用于控制异步处理过程。在具体使用时,该接口同时被 ApplicationContext 实现及具体Bean 实现,ApplicationContext 会将start/stop 的信息传递给容器中所有实现了该接口的Bean,以达到管理和控制JMX、任务调度等目的。
    ConfigurableApplicationContext 扩展于ApplicationContext,它新增加了两个主要的方法:refresh()和close(),让ApplicationContext 具有启动、刷新和关闭应用上下文的能力。在应用上下文关闭的情况下调用refresh()即可启动应用上下文,在已经启动的状态下,调用 refresh()则清除缓存并重新装载配置信息,而调用close()则可关闭应用上下文。这些接口方法为容器的控制管理带来了便利

 

代码示例:
ApplicationContext ctx =new ClassPathXmlApplicationContext("com/baobaotao/context/beans.xml");

ApplicationContext ctx =new FileSystemXmlApplicationContext("com/baobaotao/context/beans.xml");

ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"conf/beans1.xml","conf/beans2.xml"});

    ApplicationContext 的初始化和BeanFactory 有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean 时才实例目标Bean;而ApplicationContext 则在初始化应用上下文时就实例化所有单实例的Bean 。


转载自博客园的http://www.cnblogs.com/-ying/articles/3097691.html

<think>嗯,我现在需要介绍一下BeanFactoryApplicationContext的联系区别。这两个都是Spring框架里的核心接口,IoC容器相关对吧。那我得先回忆一下它们各自的作用,然后再找它们的共同点不同点。 首先,BeanFactory,我记得这是Spring里面最基础的IoC容器,负责管理Bean的生命周期,比如实例化、配置组装对象。它提供了配置框架基本功能,像延迟加载、依赖注入这些。而ApplicationContextBeanFactory的子接口,也就是说它扩展了BeanFactory的功能,增加了更多企业级的特性,比如国际化的支持、事件发布、AOP集成等等。 那它们的联系是什么呢?首先,ApplicationContext继承了BeanFactory,所以它具备BeanFactory的所有功能。也就是说,BeanFactoryApplicationContext的父接口,ApplicationContextBeanFactory的基础上进行了扩展。两者都是用来管理Bean的容器,负责创建、配置、管理Bean的实例,以及处理它们之间的依赖关系。 区别方面,可能包括以下几点。首先,BeanFactory是基础,功能相对简单,而ApplicationContext提供了更多的企业级功能。例如,ApplicationContext支持国际化,可以通过MessageSource访问资源;支持事件机制,可以通过ApplicationEventPublisher发布事件;还支持注解如@Autowired,以及更方便的AOP集成。另外,BeanFactory默认是延迟加载Bean的,也就是当第一次请求的时候才会初始化Bean,而ApplicationContext默认在启动时就会预初始化所有的单例Bean,这样可以尽早发现配置错误。还有,ApplicationContext整合了更多的Spring功能,比如访问资源文件、Web应用上下文等。 可能还需要举一些例子说明它们的应用场景。比如在资源有限的移动设备应用里,可能更倾向于使用BeanFactory,因为它的启动更快,资源占用更少。而大部分企业级应用,特别是Web应用,通常会使用ApplicationContext,因为它提供了更全面的功能,虽然启动时间稍长,但带来的便利性更高。 不过,有没有可能我哪里记错了呢?比如,BeanFactory是否真的不支持事件机制?ApplicationContext的事件机制是不是在BeanFactory基础上添加的?是的,事件机制是在ApplicationContext中新增的。还有,ApplicationContext是不是在启动时就加载所有单例Bean?是的,默认情况下是的,但可以通过设置懒加载来改变。 总结下来,两者的联系是ApplicationContext继承并扩展了BeanFactory,而区别主要在于功能丰富性、初始化策略以及对框架特性的支持上。需要确保这些点都正确,并且用清晰的中文表达出来。</think>BeanFactory ApplicationContextSpring 框架中两个核心的 IoC(控制反转)容器接口,二者既有联系又有区别,以下是它们的详细对比: --- ### **联系** 1. **继承关系** ApplicationContextBeanFactory 的直接子接口,这意味着它继承了 BeanFactory 的所有功能,包括 Bean 的创建、依赖注入生命周期管理等基础能力。 2. **共同目标** 两者都是用于管理 Spring Bean 的容器,负责实例化、配置组装对象,并解决对象之间的依赖关系。 --- ### **区别** | **特性** | **BeanFactory** | **ApplicationContext** | |-------------------------|------------------------------------------|---------------------------------------------| | **功能范围** | 基础功能:Bean 的创建与管理。 | 扩展功能:在 BeanFactory 基础上,集成企业级特性(如国际化、事件机制、资源访问等)。 | | **初始化策略** | 默认**延迟加载**(按需初始化 Bean)。 | 默认**预加载**(启动时初始化所有单例 Bean,尽早暴露配置问题)。 | | **国际化支持** | 不支持。 | 通过 `MessageSource` 接口支持多语言。 | | **事件机制** | 无内置事件发布/监听。 | 提供 `ApplicationEventPublisher`,支持事件驱动模型。 | | **资源访问** | 需自行处理资源加载。 | 内置 `ResourceLoader`,支持便捷访问文件、URL 等资源。 | | **AOP 与注解支持** | 需额外配置。 | 原生支持 `@Autowired`、`@Transactional` 等注解及 AOP 集成。 | | **适用场景** | 资源受限环境(如移动设备),轻量级应用。 | 企业级应用(如 Web 服务),需要完整 Spring 生态支持。 | --- ### **代码示例对比** ```java // 使用 BeanFactory(需显式初始化) XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml")); MyBean bean = factory.getBean(MyBean.class); // 使用 ApplicationContext(自动初始化) ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); MyBean bean = context.getBean(MyBean.class); ``` --- ### **总结** - **BeanFactory** 是 Spring 的底层容器,提供基础 IoC 功能,适合轻量级场景。 - **ApplicationContext** 是功能全面的高级容器,扩展了企业级特性,是大多数应用的首选。 - 实际开发中,通常直接使用 ApplicationContext(如 `ClassPathXmlApplicationContext` 或 `AnnotationConfigApplicationContext`),以充分利用 Spring 的完整能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值