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)然后根据类型分别进行注入处理。到此,依赖注入基本到底。
?