【Spring IoC】IoC容器初始化(二)

本文详细解析了Spring框架中Ioc容器的初始化过程,包括BeanDefinition的Resource定位、载入与解析,以及在Ioc容器中的注册。并强调了初始化过程与依赖注入的分离,为读者提供了一个清晰的Ioc容器启动流程。

Ioc容器的初始化是由refresh()方法来启动的,这个方法标志着Ioc容器的正式启动。

具体来说这个启动过程包括三个基本过程:

  • BeanDefinition的Resource定位
  • BeanDefinition的载入与解析
  • BeanDefinition在Ioc容器中的注册

Spring把这三个过程分开,并使用不同的模块来完成,如使用相应的ResourceLoader、BeanDefinitionReader等模块,通过这样的实际方式,可以让用户更加灵活的对这三个过程进行剪裁和扩展,定义出最适合自己的Ioc容器的初始化过程。

一、BeanDefinition的Resource定位

这个Resource定位指的是BeanDefinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供了统一的接口。例如:

在文件系统中的Bean定义信息可以使用FileSystemResource来进行抽象。

在类路劲中的Bean定义信息可以使用ClassPathResource。

这个定位过程类似于容器寻找数据的过程,就想水桶装水先要把水找到一样。

二、BeanDefinition的载入与解析

这个载入过程是把用户定义好的Bean表示成Ioc容器内部的数据结构,而这个容器内部的数据结构就是BeanDefinition。具体来说,BeanDefinition实际上就是POJO对象在IOC容器中的抽象,通过这个BeanDefinition定义的数据结构,使IOC容器能够方便的对POJO对象也就是Bean进行管理。

三、BeanDefinition在Ioc容器中的注册

这个操作是通过调用BeanDefinitionRegistry接口来实现的。这个注册过程把载入过程中解析得到的BeanDefinition向Ioc容器进行注册。在IOC容器内部将BeanDefinition注入到一个HashMap中去,Ioc容器就是通过这个HashMap来持有这些BeanDefinition数据的。

注:这里说到的Ioc容器的初始化过程,一般不包含Bean依赖注入的实现。在Ioc的设计中,Bean定义的载入和依赖注入是俩个独立的过程。依赖注入一般发生在应用第一次通过getBean向容器索取Bean的时候。(使用预实例化的配置除外)

转载于:https://www.cnblogs.com/myitnews/p/11548260.html

Spring IOC(Inversion of Control,控制反转)是 Spring 框架的核心功能之一,通过依赖注入(Dependency Injection)实现对象的创建和管理,其容器初始化过程、方法及原理如下: ### 初始化过程 IOC 的整个初始化流程可以概要地分为三大步骤:定位,加载,注册 [^1]。 - **定位**:寻找需要初始化哪些 Bean。这一步也被称作 BeanDefinition 的 Resource 定位,即确定要从哪些资源(如 XML 文件、Java 配置类等)中加载 Bean 的定义信息 [^1][^2]。 - **加载**:将寻找到需要初始化的 Bean 进行解析封装。也就是对资源中定义的 BeanDefinition 进行解析和载入,将资源中的配置信息转换为容器内部可以使用的 BeanDefinition 对象 [^1][^2]。 - **注册**:这一步是将第步加载后的 Bean 放入 IOC 容器,也就是放入 Map 集合之中,即完成 BeanDefinition 在 IoC 容器的注册,使得容器可以根据这些注册信息来创建和管理 Bean [^1][^2]。 在准备阶段,Spring 首先设置容器状态为“激活”,并初始化环境变量。环境变量是 Spring 应用的全局配置,包含了系统属性、环境变量和配置文件中的属性值,为后续的资源解析和 Bean 定义提供了基础。此外,Spring 还会准备早期事件监听器,确保在容器尚未完全初始化也能处理特定事件 [^4]。 ### 初始化方法 以下提供一些代码示例来说明初始化方法: #### 基于 XML 配置 ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="exampleBean" class="com.example.ExampleBean"> <!-- 配置属性 --> </bean> </beans> ``` 在 Java 代码中使用: ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取 Bean ExampleBean exampleBean = (ExampleBean) context.getBean("exampleBean"); } } ``` #### 基于 Java 配置 ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public ExampleBean exampleBean() { return new ExampleBean(); } } ``` 在 Java 代码中使用: ```java import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); // 获取 Bean ExampleBean exampleBean = context.getBean(ExampleBean.class); } } ``` ### 初始化原理 Spring IOC 容器的核心是一个 BeanFactory 或其子类,如 ApplicationContext。其初始化原理基于控制反转和依赖注入的思想,将对象的创建和管理从代码中解耦出来,交给容器来完成。 在容器初始化过程中,通过定位、加载和注册 BeanDefinition,容器掌握了所有 Bean 的定义信息。当需要使用某个 Bean 容器根据 BeanDefinition 来创建和配置 Bean 实例,并将其提供给调用者。同Spring 还提供了一系列的扩展点,如 BeanFactoryPostProcessor 控制 “造什么 Bean”,BeanPostProcessor 控制 “怎么造 Bean”,生命周期回调控制 “Bean 初始化做什么”,这些扩展点可以让开发者在容器初始化的不同阶段进行自定义操作 [^3][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值