依赖注入之Bean的实例化

上一篇分析到了通过递归的方式获取Bean的所有依赖,接下来就该实例化Bean了。
对于实例化Bean,Spring提供了两种方式,一种是Jdk的反射功能,还有一种就是Cglib。这两种实例化的方式的区别是什么呢?
这里写图片描述
依赖注入的起点是getBean方法,然后会调用createBean方法来实现这个过程。
进入createBean方法
这里写图片描述
这里写图片描述
resolveBeanClass方法判断需要创建的Bean的class是否可以实例化,是否可以通过类加载器进行加载,可以看成对Class的校验。如果Bean配置了相关的处理器,resolveBeforeInstantiation方法会返回Bean的一个代理对象,相关原理在分析依赖注入的时候会进行详细分析。
doCreateBean是实例化Bean的方法,进入doCreateBean方法
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
方法中调用了两个特别重要的方法,分别是createBeanInstance和populateBean。createBeanInstance用于创建Bean实例,populateBean向创建好的Bean实例中注入依赖关系。
BeanWrapper类型的对象是对创建之后的Bean对象的封装。如果是单例的Bean,则先把缓存中beanName相同的Bean删除。
这里写图片描述
这里写图片描述
这里写图片描述
createBeanInstance方法中创建Bean的实例,方法中给出了多种生成实例的方法,比如使用工厂方法,使用带参数的构造方法或者使用默认的构造函数的方法等。其中使用带参数的构造方法来实例化Bean的过程非常复杂,感兴趣的同志可以研究一把。所以接下来重点分析使用默认的构造函数的实例化方式。
这里写图片描述
实例化之后的Bean是Object对象的,通过这个方法,将其封装成BeanWrapper类型的对象。进入instantiate方法。
这里写图片描述
这里写图片描述
文章开头我们提到利用反射和Cglib的方式实例化Bean有什么区别。区别就是如果有需要覆盖或者动态替换的方法使用Cglib进行动态代理,如果没有需要动态改变的方法那就直接使用反射进行实例化。所谓的动态替换或覆盖的情况,就是使用了replace或者lookup的配置方法。这两个方法的作用就是在调用目标方法的时候,对调用过程进行拦截,调用实现增强功能的拦截器,返回原来实例的代理。关于拦截和代理这部分会在AOP中进行详细的分析。
接下来就是分别使用Jdk的反射和Cglib进行实例化的具体过程了。
这里写图片描述
熟悉反射的同志应该一眼就能看懂这个方法做了什么。
这里写图片描述
标准的使用Enhancer实例化对象的方法,包括设置基类,回调方法等。这个方法中出现了LookupOverrideMethodInterceptor和ReplaceOverrideMethodInterceptor两个拦截器,作用就是拦截目标方法,实现方法增强的功能。
Bean对象已经创建好了,接下来就该进行依赖注入了。
未完待续。。。。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值