spring中BeanFactory和ApplicationContext

本文解析了Spring框架中的两大核心容器:BeanFactory与ApplicationContext的区别与联系。BeanFactory作为IoC的基础,提供基本的对象管理功能,而ApplicationContext则在此基础上增加了更多面向应用的支持。

BeanFactory是Spring框架最核心的接口,它提供了高级IoC的配置机制。BeanFactory使管理不同类型的Java对象称为可能。

ApplicationContext建立在BeanFactory基础之上,提供更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建实际应用。

我们一般称BeanFactoryIoC容器,而称ApplicationContext为应用上下文。但有时为了行为方便,我们也将ApplicationContext称为Spring容器。

对于两者的用途,我们可以进行简单划分:BeanFactorySpring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合我们都直接使用ApplicationContext而非底层的BeanFactory

 

愚见:ApplicationContext间接BeanFactory,最大的区别是BeanFactory初始化时不会去实例化XML配置文件里的bean,只有被调用是才会去实例化该bean,对于singleton的bean来说,BeanFactory会缓存该实例。ApplicationContext在初始化时,会先实例化singleton的bean(spring的bean是否单例由scope属性或singleton属性决定,默认为singleton,即单例,注意,是在该IOC容器内单例,classloader就不一样了),当然可以通过XML配置文件中bean标签的lazy-init属性来指定该bean是否需要延迟加载,但有种特殊情况是,非懒加载的bean依赖与懒加载的bean是,懒加载功能就失效了。在web开发中,通常实用ApplicationContext来作为容器,特别是WebApplicationContext

 

如有错误,请指正!

### SpringBeanFactory ApplicationContext 的区别及用途 #### 1. 功能范围 `BeanFactory` 是 Spring 框架中的基础容器,提供最基本的依赖注入功能。它主要负责管理 Bean 的生命周期、实例化依赖解析[^3]。相比之下,`ApplicationContext` 是 `BeanFactory` 的扩展版,除了具备 `BeanFactory` 的所有功能外,还提供了更多的企业级特性,例如国际化支持(i18n)、事件传播机制 AOP 支持等[^2]。 #### 2. 初始化性能 `BeanFactory` 在启动时采用延迟加载的策略,只有在需要使用某个 Bean 时才会对其进行实例化。这种方式可以减少内存占用初始化时间,适合资源受限的环境[^5]。而 `ApplicationContext` 在启动时会预加载所有的单例 Bean,这可能会增加启动时间,但能够提前发现配置错误并提升运行时性能[^4]。 #### 3. 适用场景 - **`BeanFactory`**:适用于对性能要求极高且资源受限的场景,例如嵌入式设备或小型应用中。由于其轻量级的特点,`BeanFactory` 是这些场景的理想选择[^3]。 - **`ApplicationContext`**:几乎适用于所有企业级应用场景。它不仅提供了丰富的功能,还简化了开发过程,使得开发者能够更专注于业务逻辑而非框架细节。 #### 4. 示例代码 以下是一个简单的代码示例,展示如何使用 `BeanFactory` `ApplicationContext`: ```java // 使用 BeanFactory DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); reader.loadBeanDefinitions("applicationContext.xml"); MyService myService = beanFactory.getBean(MyService.class); myService.execute(); // 使用 ApplicationContext AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); MyService myServiceFromContext = context.getBean(MyService.class); myServiceFromContext.execute(); ``` #### 5. 特性对比表 | 特性 | BeanFactory | ApplicationContext | |---------------------|-------------------------------------|------------------------------------------| | 基础功能 | 提供 IoC 容器的基本功能 | 包含 BeanFactory 的所有功能 | | 国际化支持 | 不支持 | 支持 | | 事件监听机制 | 不支持 | 支持事件发布与监听 | | 资源加载 | 需要手动实现 | 内置资源加载功能 | | 启动性能 | 启动快,按需加载 | 启动较慢,预加载所有单例 Bean | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值