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
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