您的位置:首页 > 编程语言 > Java开发

Spring技术内幕之IOC容器的实现(01)-IOC容器初始化过程

2016-05-19 11:00 761 查看
Spring IOC容器的初始化过程

Spring IOC容器的初始化过程主要包括BeanDefinition的Resouce定位/载入/注册三个基本过程。Spring把这三个过程的实现分别放在不同的模块下,通过这样的设计方式可以使用户更加灵活地对这个三个过程进行裁剪和自定义扩展,定制属于自己的IOC容器的初始化过程。

第一个过程是Resouce定位过程。Resouce定位指的是BeanDefinition的资源定位,它由ResouceLoader通过统一的Resouce接口完成,Resouce

对各种形式的BeanDefinition提供了统一接口。比如:在文件系统中Bean的定义信息可以使用FileSystemResouce来进行抽象,在类路径中的

Bean的定义信息可以使用ClassPatchResouce来使用等,这个Resouce资源定位的过程类似于容器寻找数据的过程,就好比用水桶装水先找到水源一样。

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

第三个过程是向IOC容器注册BeanDefinition的过程。这个过程通过调用BeanDefinitionRepository接口的实现来完成。这个注册过程把载入过程中解析得到的BeanDefinition向IOC容器进行注册,在IOC容器的内部将BeanDefinition注入到ConcurrentHashMap对象中,通过KEY获取指定Bean的信息。

在JDK1.5起增加了concurrent包提供了线程安全的ConcurrentHashMap

ConcurrentHashMap代码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。

在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中

ConcurrentHashMap类的设计:

public class ConcurrentHashMap<K, V> extends AbstractMap<K, V>

implements ConcurrentMap<K, V>, Serializable









IOC容器初始化过程一般不包含Bean依赖注入的实现,在Spring IOC设计中,Bean定义的载入和依赖注入的过程是两个独立的过程,依赖注入一般发生在应用第一次通过getBean向容器索取Bean的时候。但是有一个例外指得注意:使用IOC容器时有个预实例化配置,也就是在xml文件中为Bean定义lazyinit属性,那么这个Bean的依赖注入在IOC容器初始化时就预先完成了,而不需要等到整个初始化完成以后,第一调用getBean时才触发。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: