ioc容器

本文介绍了Spring框架中的两种核心IoC容器:BeanFactory和ApplicationContext。BeanFactory是最基础的容器,而ApplicationContext则是BeanFactory的扩展,提供了更多的高级特性,如国际化支持等。此外,还详细说明了如何通过XML配置文件来初始化这两种容器。

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

IOC:控制反转思想.

Spring 提供了两种 IoC 容器,分别为 BeanFactory 和 ApplicationContext,接下来将针对这两种 IoC 容器进行详细讲解。

beanfactory:是基础类的IOC容器,它由org.springframework.beans.facytory.BeanFactory 接口定义,并提供了完整的IOC服务支持,简单来说,BeanFactory 就是一个管理 Bean 的工厂,它主要负责初始化各种 Bean,并调用它们的生命周期方法
BeanFactory 接口有多个实现类,最常见的是org.springframework.beans.factory.xml.XmlBeanFactory,它是根据 XML 配置文件中的定义装配 Bean 的。

创建 BeanFactory 实例时,需要提供 Spring 所管理容器的详细配置信息,这些信息通常采用 XML 文件形式管理。其加载配置信息的代码具体如下所示:

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D://applicationContext.xml"));

ApplicationContext: ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。该接口的全路径为 org.springframework.context.ApplicationContext,它不仅提供了 BeanFactory 的所有功能,还添加了对 i18n(国际化)、资源访问、事件传播等方面的良好支持。

ApplicationContext 接口有两个常用的实现类,具体如下。
1)ClassPathXmlApplicationContext
该类从类路径 ClassPath 中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,具体如下所示。

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

2)FileSystemXmlApplicationContext
该类从指定的文件系统路径中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,具体如下所示。

ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

它与 ClassPathXmlApplicationContext 的区别是:在读取 Spring 的配置文件时,FileSystemXmlApplicationContext 不再从类路径中读取配置文件,而是通过参数指定配置文件的位置,它可以获取类路径之外的资源,如“F:/workspaces/applicationContext.xml”。

通常在 Java 项目中,会采用通过 ClassPathXmlApplicationContext 类实例化 ApplicationContext 容器的方式,而在 Web 项目中,ApplicationContext 容器的实例化工作会交由 Web 服务器完成。Web 服务器实例化 ApplicationContext 容器通常使用基于 ContextLoaderListener 实现的方式,它只需要在 web.xml 中添加如下代码:

<!--指定Spring配置文件的位置,有多个配置文件时,以逗号分隔-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <!--spring将加载spring目录下的applicationContext.xml文件-->
    <param-value>
        classpath:spring/applicationContext.xml
    </param-value>
</context-param>
<!--指定以ContextLoaderListener方式启动Spring容器-->
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

需要注意的是,BeanFactory 和 ApplicationContext 都是通过 XML 配置文件加载 Bean 的。

二者的主要区别在于,如果 Bean 的某一个属性没有注入,则使用 BeanFacotry 加载后,在第一次调用 getBean() 方法时会抛出异常,而 ApplicationContext 则在初始化时自检,这样有利于检查所依赖的属性是否注入。

### Spring框架中IOC容器的作用与原理 #### 一、IOC容器的核心概念 IOC(Inversion of Control,控制反转)是Spring框架的核心思想之一。它的主要作用是通过将对象的创建和管理交由外部环境(即Spring框架或IoC容器),从而降低模块间的耦合度[^1]。 具体来说,控制反转意味着开发人员不再手动负责对象的实例化及其依赖关系的维护,而是让这些工作由IoC容器完成。这种机制使得应用程序更加灵活,便于测试和扩展。 --- #### 二、IOC容器的主要功能 IoC容器不仅承担了对象的创建职责,还提供了以下重要功能: 1. **依赖注入(Dependency Injection, DI)** IoC容器会自动解析并注入Bean之间的依赖关系。这可以通过XML配置文件或者注解的方式实现。例如,在基于注解的情况下,`@Autowired`可以用于标记需要被注入的字段或方法参数[^2]。 2. **生命周期管理** 容器会对Bean的整个生命周期进行管理,包括初始化、运行期间的状态更新以及销毁阶段的操作。开发者可以通过定义特定的方法来参与这一过程,比如使用`@PostConstruct`标注初始化逻辑,而`@PreDestroy`则可用于清理资源。 3. **单例模式支持** 默认情况下,Spring中的Bean是以Singleton模式存在的,这意味着在整个应用上下文中只有一个该类的实例存在。当然也可以设置成Prototype或其他范围类型的Bean。 --- #### 三、IOC容器的工作流程 以下是IoC容器工作的基本步骤描述: 1. 加载配置元数据:无论是传统的XML方式还是现代推荐使用的Java Config/Annotation形式,都需要先读取到关于如何构建Beans的信息。 2. 注册BeanDefinition:对于每一个要管理的对象都会有一个对应的Bean Definition注册进入内部结构里保存起来待后续处理。 3. 实例化Bean:当某个地方需要用到某一个具体的Bean时,就会触发实际的实例化进程。如果此Bean有其他前置条件需求,则同样遵循上述原则依次加载直至满足全部要求为止。 4. 应用后处理器(Post Processors):在此之后还可以执行一些额外的动作如代理生成等特殊操作。 5. 初始化回调函数调用:最后一步就是通知已经完全准备好可供使用的状态给业务层知道。 以上每一步都可能涉及到复杂的细节处理,但总体而言这就是标准意义上的DI/IoC行为体现[^3]。 --- ```java // 示例代码展示简单的 Bean 配置与依赖注入 @Configuration public class AppConfig { @Bean public MyService myService() { return new MyServiceImpl(); } } @Component class AnotherComponent { private final MyService service; @Autowired public AnotherComponent(MyService service){ this.service = service; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值