使用的bean工厂ApplicationContext

本文详细介绍了Spring框架中的ApplicationContext接口及其三种常见实现:ClassPathXmlApplicationContext、FileSystemXmlApplicationContext和XmlWebApplicationContext。阐述了它们如何加载配置文件来实例化容器,并对比了与BeanFactory的区别。

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

实用的Bean工厂ApplicationContext

特性

编辑
在ApplicationContext接口的众多实现类中,有3个是我们经常用到的(见表1-1),并且使用这3个实现类也基本能满足我们Java EE应用开发中的绝大部分需求。
表1-1 ApplicationContext接口的常用实现类介绍
类 名 称
功 能 描 述
ClassPathXmlApplicationContext
从类路径ClassPath中寻找指定的XML配置文件,找到并装载
完成ApplicationContext的实例化工作。例如:
//装载单个配置文件实例化ApplicationContext容器
ApplicationContext cxt = new ClassPathXmlApplicationContext
("applicationContext.xml");
//装载多个配置文件实例化ApplicationContext容器
String[] configs = {"bean1.xml","bean2.xml","bean3.xml"};
ApplicationContext cxt = new ClassPathXmlApplicationContext(configs);
FileSystemXmlApplicationContext
从指定的文件系统路径中寻找指定的XML配置文件,找到并装载
完成ApplicationContext的实例化工作。例如:
//装载单个配置文件实例化ApplicationContext容器
ApplicationContext cxt = new FileSystemXMLApplicationContext
("beans.xml");
//装载多个配置文件实例化ApplicationContext容器
String[] configs = {"c:/beans1.xml","c:/beans2.xml"};
ApplicationContext cxt = new FileSystemXmlApplicationContext(configs);
XmlWebApplicationContext
从Web应用中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。这是为Web工程量身定制的,使用WebApplicationContextUtils类的getRequiredWebApplicationContext方法可在JSP与Servlet中取得IoC容器的引用

实现

编辑
这些实现类的主要区别就是装载Spring配置文件实例化ApplicationContext容器的方式不同,在ApplicationContext实例化后,同样通过getBean方法从ApplicationContext容器中获取装配好的Bean实例以供使用。
与BeanFactory不同的是,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。而BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配。
在Java项目中通过ClassPathXmlApplicationContext类手动实例化ApplicationContext容器通常是不二之选。但对于Web项目就不行了,Web项目的启动是由相应的Web服务器负责的,因此,在Web项目中ApplicationContext容器的实例化工作最好交给Web服务器来完成。

应用

编辑
Spring为此提供了两种解决方案,一种是基于ContextLoaderListener实现的(此方案只适用于Servlet2.4及以上规范的Servlet容器)。例如,在web.xml中加入如下代码:
<!-- 指定Spring的配置文件,多个配置文件以逗号分隔 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config/applicationContext.xml</param-value>
</context-param>
<!-- 指定以Listener方式启动Spring容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
另外一种方案则是基于ContextLoaderServlet实现的。例如,在web.xml中加入如下代码:
<!-- 指定Spring的配置文件,多个配置文件以逗号分隔 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config/applicationContext.xml</param-value>
</context-param>
<!-- 指定以Servlet方式启动Spring容器 -->
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
从servlet容器启动时加载组件的顺序来看,Listener组件是优先于Servlet组件的。基于Servlet方式的加载方案主要是为了兼容Servlet2.3及以下规范的Servlet容器。以Tomcat为例,Tomcat 5.x都已经支持Servlet2.4规范了,因此,基于Listener方式启动Spring容器是目前的主流选择。[1] 
ApplicationContext.xml配置文件
Spring配置文件是用于指导Spring工厂进行Bean生产、依赖关系注入(装配)及Bean实例分发的“图纸”。Java EE程序员必须学会并灵活应用这份“图纸”准确地表达自己的“生产意图”。Spring配置文件是一个或多个标准的XML文档,ApplicationContext.xml是Spring的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。
<think>好的,我现在需要回答用户关于Spring Bean工厂使用与原理的问题。首先,我需要整理用户提供的引用内容,并结合自己的知识,确保回答准确且符合用户的要求。 用户引用了四个来源,其中引用[1]提到了Bean是Spring的基本组件,由容器管理生命周期,以及DI和IoC的作用。引用[2]指向了具体的源码方法doCreateBean,这可能涉及Bean的创建过程。引用[3]解释了循环依赖的处理,提到了提前暴露Bean工厂的策略。引用[4]提到了Bean的生产原理是通过反射和构造方法,并给出了示例代码。 首先,我应该从Bean工厂的基本概念入手,说明它在Spring中的作用,比如负责Bean的创建、配置和管理。接着,结合引用[4],详细解释Bean的创建原理,特别是反射和构造方法的使用。然后,需要讨论生命周期管理,包括实例化、属性填充、初始化等阶段,这里可能需要引用[2]中的doCreateBean方法源码分析。 接下来是循环依赖的问题,这里引用[3]提到提前暴露Bean工厂对象,所以需要解释三级缓存机制,比如singletonFactories、earlySingletonObjects和singletonObjects的作用,以及如何解决循环依赖。同时,引用[1]中提到的DI和IoC如何降低耦合,可以与Bean工厂的管理机制结合起来说明。 用户还希望了解使用方式,比如如何配置Bean定义,使用注解或XML,以及通过ApplicationContext获取Bean。这部分需要结合实例代码,但用户要求使用中文回答,可能不需要代码块,但可以简单说明步骤。 此外,用户的问题可能涉及Bean工厂ApplicationContext的区别,但根据引用内容,可能不需要深入这点,但可以简要提及。最后,生成相关问题需要考虑用户可能感兴趣的扩展点,比如生命周期回调、配置方式对比、循环依赖的限制等。 需要确保所有数学表达式用$...$格式,但回答中可能较少涉及数学内容。检查LaTeX语法是否正确,例如变量或术语是否有误。回答结构要清晰,分点说明原理、生命周期、循环依赖处理和使用方式,每个部分引用对应的引用来源,并在末尾添加引用标识。 现在组织内容: 1. Bean工厂的核心作用:创建和管理Bean,引用[1]和[4]。 2. 创建原理:反射和构造方法,引用[4]的示例。 3. 生命周期:实例化、属性填充、初始化、销毁,引用[2]的doCreateBean方法。 4. 循环依赖处理:三级缓存,提前暴露工厂对象,引用[3]。 5. 使用方式:配置Bean定义,获取Bean实例,引用[1]和[4]。 6. 相关问题:生命周期回调、配置方式、循环依赖限制、性能优化等。 确保每个引用在适当的位置标注,比如处理循环依赖时引用[3],创建原理时引用[4]。回答要自然,避免堆砌术语,用简洁的中文解释概念,同时保持专业性。</think>### Spring Bean工厂使用与原理 #### 1. Bean工厂的核心作用 Bean工厂是Spring框架的核心组件,负责**Bean的创建、配置和管理**。它是依赖注入(DI)和控制反转(IoC)的实现基础,通过解耦对象的创建与使用,降低组件间的耦合度[^1]。例如,开发者无需手动通过`new`关键字实例化对象,而是由工厂根据配置自动完成。 #### 2. Bean的创建原理 Bean的实例化主要通过**反射**和**构造方法**实现。例如,Spring底层可通过以下代码创建对象: ```java TagDAO tt = (TagDAO) Class.forName("scope.TagDAOImpl").newInstance(); ``` 具体流程包括: 1. **解析配置**:读取XML、注解或Java配置类中的Bean定义。 2. **实例化对象**:通过反射调用构造方法创建Bean实例[^4]。 3. **依赖注入**:根据配置自动填充属性(如`@Autowired`)。 4. **初始化**:执行`init-method`或`@PostConstruct`方法。 #### 3. Bean的生命周期管理 Bean的生命周期由工厂全程控制,关键步骤如下(以`doCreateBean`方法为例[^2]): 1. **实例化**:调用构造方法创建对象。 2. **属性填充**:注入依赖的Bean或值。 3. **初始化**:执行初始化回调(如`InitializingBean`接口)。 4. **销毁**:容器关闭时调用销毁方法(如`@PreDestroy`)。 #### 4. 循环依赖的解决策略 当Bean A依赖Bean B,而Bean B也依赖Bean A时,Spring通过**三级缓存**解决循环依赖: 1. **singletonFactories**:存储未初始化的Bean工厂对象。 2. **earlySingletonObjects**:存储提前暴露的未完全初始化的Bean实例。 3. **singletonObjects**:存储已完全初始化的Bean实例。 具体流程: - 在Bean A实例化后(未初始化前),其工厂对象被放入`singletonFactories`。 - 当Bean B需要注入Bean A时,工厂通过缓存获取半成品Bean A,完成注入[^3]。 #### 5. Bean工厂使用方式 1. **配置Bean定义**: - **XML配置**:通过`<bean>`标签定义类和作用域。 - **注解配置**:使用`@Component`、`@Service`等注解标记Bean。 2. **获取Bean实例**: ```java ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); MyBean bean = context.getBean(MyBean.class); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值