Spring IOC实现
来源:互联网 发布:马云淘宝 编辑:程序博客网 时间:2024/05/19 18:42
- IOC实现
- 一些基本对象
- 1 BeanFatory接口
- 2 XmlBeanFactoryxml配置方式
- IOC初始化BeanDefinition的Resouce定位载入和注册以xml为例
- 1 定位
- 2 载入流程图
- 3 注册
- 依赖注入
- 1 依赖注入的实现默认是在getBean被调用的时候触发
- 容器其他相关特性的实现
- 1 lazy-init属性和预实例化
- 2 FactoryBean的实现
- 3 BeanPostProcessor的实现
- 4 autowiring的实现
- 一些基本对象
IOC实现
1. 一些基本对象
1.1 BeanFatory(接口)
描述Ioc容器的最基本功能.
BeanDefinition:描述各个对象和对象之间的关系.
1.2 XmlBeanFactory(xml配置方式)
XmlBeanDefinitionReader: 用来读取xml配置文件.
loadBeanDefinitions: 载入BeanDefinitions.
2. IOC初始化(BeanDefinition的Resouce定位,载入和注册):[^以xml为例!]
2.1 定位
resource接口的实现类来完成.
2.2 载入(流程图)
return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray)
*(具体载入委托给BeanDefinitionParserDelegate实现(具体在parseBeanDefinitions()–>parseDefaultElement()–>processBeanDefinition()– >parseBeanDefinitionElement中)
2.3 注册
在DefaultListableBeanFactory中 BeanDefinitionRegistry()接口 的实现类来完成。
3. 依赖注入
3.1 依赖注入的实现(默认是在getBean()被调用的时候触发)
由DefaultListableBeanFactory的基类AbstractBeanFactory中的getBean()实现.
a.先从缓存中取单例的bean(singleton):因为这种bean请求不需要重复地创建.
b.如果a没取到,则检测IOC中的BeanDefintion是否存在(取不到顺着双亲BeanFactory链一直向上找)
c.取当前bean的所有依赖bean,触发getBean递归调用.
d.区分单例和多例来调用ObjectFactory的createBean().createBean(在AbstractAutowireCapableBeanFactory中实现):
**具体调用doCreateBean():*其中BeanWrapper用来持有创建出来的Bean对象(如果是singleton则把缓存中的同名清除).
*createBeanInstance(beanName, mbd, args)返回BeanWrapper创建bean.—–生成 Bean包含的java对象(多种方式[默认cglib方式(在SimpleInstantiationStrategy中实现)]:属性,构造器等方式,由BeanDefition决定)
*populateBean(实现依赖注入):
—–先对autowire的注入进行处理.
—–再进行属性注入(BeanDefinitionValueResolver对BeanDefinition解析[如果bean是在双亲ioc中就从双亲ioc中取bean,在当前ioc中则直接取:用getBean()取],然后对属性值进行深拷贝再注入[具体的注入由BeanWrapperImpl的setPropertyValues()
实现]).*之后调用
initializeBean()
返回Object[bean初始化后的对象(包括依赖注入)]e.对创建出来的bean进行类型检查.
*在依赖注入过程中,多次利用getBean的递归调用(创建bean时递归,注入bean时递归,),在解析的时候也用到了递归.
4.容器其他相关特性的实现
4.1 lazy-init属性和预实例化
reflash中的finishBeanFactoryInitialization封装了对lazy-init属性的处理,实际的处理是DefaultListableBeanFactory的preInstantiateSingletons方法完成(也是用getBean触发依赖注入).
4.2 FactoryBean的实现
1.可用于代理,等.
2.流程:AbstractBeanFactory->getBean()->doGetBean()->getObjectForBeanInstance()->doGetObjectFromFactoryBean()->getObject().
BeanFactory 与 FactoryBean的区别及FactoryBean详解
4.3 BeanPostProcessor的实现
- 作用
- 监听容器触发事件(postProcessBeforeInitialization和postProcessAfterInitialization两个接口方法).
- 具体调用
- 在3.1中提到的populateBean中initializeBean中被回调.
4.4 autowiring的实现
- 作用
- 自动依赖装配.
- 具体调用
- 在3.1中提到的populateBean中实现(由getBean()得到bean设置到当前bean的属性中).
- Spring IoC实现
- spring IOC 简易实现
- spring Ioc 简单实现
- 自己动手实现spring ioc
- Spring中的IOC实现
- 模拟实现Spring IOC
- Spring IOC容器实现
- Spring - 如何实现IOC
- Spring IOC的实现
- Spring 简单IOC实现
- Spring实现IOC容器
- Spring IOC容器实现
- Spring IOC原理实现
- 实现Spring IOC
- Spring IOC实现
- 【spring】tinyspring 实现ioc
- Spring IOC实现原理
- spring IOC学习,手动实现IOC容器
- 选择相册上传图片 展示图片(仿微信选择图片)
- 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(MARK)
- 利用scrapy框架python爬虫初探
- MongoDB实战-如何在Windows环境下管理副本集
- 关于matplotlib画图。中文乱码
- Spring IOC实现
- mysql存储过程
- C# WinForm窗体应用(第四天)
- EasyNVR H5无插件摄像机直播解决方案前端解析之:引用videojs无法自动播放
- JOB:面试基础2
- java中Date的一些操作
- mysql中innodb和myisam的区别
- linux shell循环操作 + word2vec词向量训练/聚类的参数解释
- 修改《Spark快速大数据分析》的WordCount.java,使它通过maven编译,并在Spark2上运行