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时才触发。
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时才触发。
相关文章推荐
- java设计六原则
- spring01
- spring源码分析(二)- 容器基础
- java导入导出excel 01
- java中base包DBmanager直接面向 数据库的 详解
- 【java】File,file.getPath(), getAbsolutePath(), getCanonicalPath()区别
- 详解JavaEE使用过滤器实现登录(用户自动登录 安全登录 取消自动登录黑用户禁止登录)
- 如何在 Mac 上卸载 Java 7 和更高版本?
- [javaSE] 位运算符(&|^)
- 导出excel时java反射的一些方法
- 【Java工具类】 POI操作word文档模版可修改文字图片
- SpringMVC中使用Interceptor拦截器
- Android开发效率—Eclipse快捷键
- 浅谈Java中的锁
- Java发送电子邮件的完整代码,可发送附件
- Java仿文库的基本方法(openoffice+swftools+flexPaper)
- SpringMVC拦截器(资源和权限管理)
- java编程思想之初始化类的加载
- 关于java中的datetime数据类型的加减计算(部分转载部分原创)
- 解决java连接Hbase程序卡住执行也不报错的问题