Spring源码分析 之 Spring IOC容器初始化过程—配置信息加载与注册

Spring IOC容器初始化过程(二)配置信息加载与注册

上文中 Spring IOC容器初始化过程(一)资源定位过程 我们一起分析了资源定位的过程,Spring IOC 容器在初始化的过程中并不是直接读取配置文件然后进行加载,而是在开始做了许多准备工作,先初始化资源读取器,设置其读取策略,校验策略,再将数据加载至内存中,最后封装为BeanDefinition对象进行注册。

整体加载的时序图

 工程目录

 

POM文件

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>org.example</groupId>    <artifactId>springTest</artifactId>    <version>1.0-SNAPSHOT</version><dependencies>    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-context</artifactId>        <version>5.0.2.RELEASE</version>    </dependency></dependencies></project>复制代码

测试代码

public class ServiceB {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");        Object serviceA = context.getBean("serviceA");        System.out.println(serviceA);    }}复制代码

xml配置

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:cache="http://www.springframework.org/schema/cache"       xmlns:p="http://www.springframework.org/schema/p"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd       http://www.springframework.org/schema/context       http://www.springframework.org/schema/context/spring-context.xsd       http://www.springframework.org/schema/cache       http://www.springframework.org/schema/cache/spring-cache.xsd">    <context:component-scan base-package="com.donkeys.spring"/>    <bean id="serviceA" class="com.donkeys.spring.service.ServiceA"></bean></beans>复制代码

加载过程

接上文,上文中我们已经获取到了
ClassPathXmlApplicationContext的实例化对象返回的配置文件路径信息,同时调用了资源读取器的loadBeanDefinitions方法,下面从这个方法开始,正式进入到资源加载过程

XmlBeanDefinitionReader 的loadBeanDefinitions方法

public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException;

/** * Load bean definitions from the specified XML file. * @param encodedResource the resource descriptor for the XML file, * allowing to specify an encoding to use for parsing the file * @return the number of bean definitions found * @throws BeanDefinitionStoreException in case of loading or parsing errors */public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {//判断传入的xml文件资源是否为空Assert.notNull(encodedResource, "EncodedResource must not be null");if (logger.isInfoEnabled()) {logger.info("Loading XML bean definitions from " + encodedResource.getResource());}//resourcesCurrentlyBeingLoaded 是一个ThreadLocal 变量,从当前线程变量获取当前的资源描述文件Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();if (currentResources == null) {currentResources = new HashSet<>(4);this.resourcesCurrentlyBeingLoaded.set(currentResources);}//如果没有添加成功,则表示已经有了这个资源,则抛出异常,不能循环加载if (!currentResources.add(encodedResource)) {throw new BeanDefinitionStoreException("Detected cyclic loading of " + encodedResource + " - check your import definitions!");}try {//将资源描述文件转换为 输入流InputStream inputStream = encodedResource.getResource().getInputStream();try {InputSource inputSource = new InputSource(inputStream);if (encodedResource.getEncoding() != null) {inputSource.setEncodi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值