Spring ioc 的依赖注入

Spring ioc 的依赖注入

根据网上的资料以及《Spring 技术内幕》画出主要类中调用的核心方法

这里写图片描述

对流程的理解
AbstractBeanFactory类调用getBean(),启动注入bean而getBean(),中实际调用的是dogetBean()方法,该方法委派AbstractAutowireCapableBeanFactory的  
creatBean()创建Bean实例对象,在该方法中如果Bean配置了初始化前和初始化后的处理器,则试图返回一个需要创建Bean的代理对象,否则调  
用docreatbean()方法进入创建Bean。在创建bean时有两步,第一是实例化bean,另一个是为bean设置属性;分别对应
- createBeanInstance:生成Bean所包含的java对象实例。
- populateBean :对Bean属性的依赖注入进行处理。
先看createBeanInstance()
在该方法里面对ioc注册BeanDefinition进行了一系列的判断,包括有无工厂实例方法,是否为自动装配,都不是的
话就采用使用默认的无参构造方法实例化, 
其分别对应的函数为instantiateUsingFactoryMethod()、autowireConstructor(beanName, mbd, null, null),和
instantiateBean(final String beanName, final RootBeanDefinition mbd),这里分析用默认的无参构造方法实例化的例子,instantiateBean()中调用
了beanInstance = getInstantiationStrategy().instantiate(mbd,beanName,parent);改方法在SimpleInstantiationStrategy类中实现,在方法体重如  
果Bean定义中没有方法覆盖,则就不需要CGLIB父类类的方法,此时使用BeanUtils的BeanUtils.instantiateClass(constructorToUse)实例化,通过反射机制
调用”构造方法.newInstance(arg)”来进行实例化,在这中实例化前先要获取beanDefinition对象的构造方法或工厂方法,若没有测通过使用JDK反射机制获取
Bean的构造方法,Bean定义中有方法覆盖,则使用CGLIB进行实例化调用instantiateWithMethodInjection(beanDefinition,beanName,owner),进而使
用CglibSubclassingInstantiationStrategy的instantiate(),完成实例化。
再看populateBean()
```
两个方法是嵌套进行的不是独立分的,方法中调用applyPropertyValues()解析并注入依赖属性的过程,在applyPropertyValues()中,属性值类型不需要转换时,
不需要解析属性值,直接准备进行依赖注入。属性值需要进行类型转换时,如对其他对象的引用等,首先需要解析属性值,然后对解析后的属性值进行依赖注  
入,此时调用的是resolveValueIfNecessary().最后调用setPropertyValue(PropertyTokenHolder tokens, PropertyValue pv)实现属性依赖注入功能。这  
样ioc容器中依赖注入就完成了。

“`

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值