首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring源码浅析 - 依赖注入

2012-10-10 
Spring源码浅析 -- 依赖注入Ioc已经完成了对配置文件的载入和解析,接下来将会完成Ioc容器的核心功能 依赖

Spring源码浅析 -- 依赖注入

Ioc已经完成了对配置文件的载入和解析,接下来将会完成Ioc容器的核心功能 依赖注入。

在依赖注入之前,还要进行对bean的生成和初始化,生成方式分为两种JDK自身的方式和引入CGLIB类库的方式。

首先就从触发这一系列过程的入口说起,BeanFactroy.getBean

?

1.bean在BeanFactroy中的生成

getBean方法的具体实现是在AbstractBeanFactory中

?这个方法首先处理beanName(transformedBeanName(name)),因为会用&开头的情况,然后会在以前的singleton缓存中去找需要的bean(getSingleton(beanName)),因为如果是singleton的bean就不用再创建,然后判断此bean是否在此beanfactory中定义(containsBeanDefinition(beanName)),如果没有递归至双亲beanfactory,以上条件不满足的话,接下来得到beandefination的定义(getMergedLocalBeanDefinition(beanName)),开始创建bean,第一步分析此bean的depand-on的情况,先把它们初始化,第二步判断bean的生命周期,如果是singleton的话,使用对应的singletonFactory来生成,如果是prototype的,使用createBean(beanName, mbd, args)方法生成。

?

createBean(beanName, mbd, args)方法的具体实现是在AbstractAutowireCapableBeanFactory中实现

?

?

除去一些验证工作,创建bean在doCreateBean(beanName, mbd, args)中实现

?

?在此引入一个bean的包装类BeanWrapper,如果是singleton的,先从缓存中取(instanceWrapper = this.factoryBeanInstanceCache.remove(beanName)),如果为null的话 进入createBeanInstance(beanName, mbd, args)方法

?

?如果此bean配置了工厂方法(mbd.getFactoryMethodName() != null),则使用工厂类进行bean的创建,如果此bean注入了构造器参数(ctors != null),则使用非默认的构造器对应的方法autowireConstructor进行生成,最后一种情况是最常见的,非工厂类,且使用默认无参的构造方法,instantiateBean(beanName, mbd)

?

?

?这里面主要是生成一个PropertyTokenHolder对象? 然后重载到setPropertyValue(tokens, pv)中

?在这个非常长的方法里面真正完成了依赖注入的实现,对property进行类型的判断(propValue.getClass().isArray(),propValue instanceof List,propValue instanceof Map)然后根据类型分别进行注入处理。到此,依赖注入基本到底。

?

热点排行