《Spring技术内幕》学习笔记2——IoC定位Bean定义资源

 

1.IoC容器初始化:

SpringIoC容器初始化包括:Bean定义资源文件的定位、载入和注册3个基本过程。

(1).Bean定义资源文件的定位:

Bean定义资源文件定位由ResourceLoader通过统一的Resource接口来完成,Resource接口将各种形式的Bean定义资源文件封装成统一的、IoC容器可进行载入操作的对象。

(2).Bean定义资源文件的载入:

Bean定义资源文件载入的过程是将Bean定义资源文件中配置的Bean转换成IoC容器中所管理Bean的数据结构形式。SpringIoC中管理的Bean的数据结构是BeanDefinitionBeanDefinitionPOJO对象在IoC容器中的抽象。

(3).Bean定义的注册:

通过调用BeanDefinitionRegistry接口把从Bean定义资源文件中解析的BeanIoC容器进行注册,在IoC容器内部,是通过一个HashMap来存储这些Bean对象数据的。

注意:IoC容器和上下文初始化一般不包含Bean依赖注入的实现。一般而言,依赖注入发送在应用第一次通过getBean方法向容器获取Bean时。但是有个特例是:IoC容器预实例化配置的lazyinit属性,如果某个Bean设置了lazyinit属性,则该Bean的依赖注入在IoC容器初始化时就预先完成了。

 

2.Bean定义资源文件的定位过程:

ApplicationContext是一个在BeanFactory基础上提供了扩展的接口,具体的IoC容器实现常用的有:(从文件系统中读入Bean定义资源文件)ClassPathXmlApplicationContext(Classpath类路径中读入Bean定义资源文件)XmlWebApplicationContext(Web容器如Tomcat等中读入Bean定义资源文件)等。以FileSystemXmlApplicationContet为例,通过分析FileSystemXmlApplicationContet及其父类的源码来分析IoC容器定位Bean定义资源文件的实现过程

3. FileSystemXmlApplicationContet的初始化过程:

FileSystemXmlApplicationContet的源码如下:

 

 

通过分析FileSystemXmlApplicationContext的源代码可以知道,在创建FileSystemXmlApplicationContext容器时,构造方法做以下两项重要工作:

首先,调用父类容器的构造方法(super(parent)方法)为容器设置好Bean资源加载器。

然后,再调用父类AbstractRefreshableConfigApplicationContextsetConfigLocations(configLocations)方法设置Bean定义资源文件的定位路径。

4. FileSystemXmlApplicationContext调用父类构造方法所做的工作:

 

通过追踪FileSystemXmlApplicationContext的继承体系,发现其父类的父类AbstractApplicationContext中初始化IoC容器所做的主要源码如下:

 

 

5. AbstractApplicationContext构造方法中调用PathMatchingResourcePatternResolver的构造方法创建Spring资源加载器:

 

PathMatchingResourcePatternResolver的构造方法如下:

 

 

在设置容器的资源加载器之后,接下来FileSystemXmlApplicationContet执行setConfigLocations方法调用父类其类的相关方法定位Bean定义资源文件。

6. AbstractRefreshableConfigApplicationContext定位Bean定义资源文件:

在对FileSystemXmlApplicationContet的源码分析中我们看到,在其入口构造函数中,通过调用其父类AbstractRefreshableConfigApplicationContext方法进行对Bean定义资源文件的定位,该方法的源码如下:

 

 

 

 

 

通过这两个方法的源码我们可以看出,我们既可以使用一个字符串来配置多个Spring Bean定义资源文件,也可以使用字符串数组,即下面两种方式都是可以的:

a.    ClasspathResource res = new ClasspathResource(“a.xml,b.xml,……”);

多个资源文件路径之间可以是用” ,; /t/n”等分隔。

b.    ClasspathResource res = new ClasspathResource(newString[]{“a.xml”,”b.xml”,……});

至此,Spring IoC容器在初始化时将配置的Bean定义资源文件定位为Spring封装的Resource

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值