依赖注入之Bean的实例化
来源:互联网 发布:淘宝上win10激活码 编辑:程序博客网 时间:2024/05/22 12:11
上一篇分析到了通过递归的方式获取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对象已经创建好了,接下来就该进行依赖注入了。
未完待续。。。。。。
- 依赖注入之Bean的实例化
- 依赖注入之Bean实例化前的准备
- 2.bean的命名和实例化、依赖注入方式
- 六、基于xml的bean实例化和依赖注入
- Spring源码解析:Bean的实例化与依赖注入(四)
- Angular2 依赖注入之实例化过程
- (学习笔记)spring入门之Bean的依赖注入
- HttpSessionListener中使用依赖注入的方式完成Bean实例的注入
- 非springmvc依赖注入,通过手动注入Bean,实现实例化
- LINK - MvvmCross依赖注入的实例化
- Bean的两种依赖注入方式
- Spring中bean的依赖注入解析
- spring源码解读 Bean的依赖注入
- Bean 的依赖注入简述与示例
- spring 依赖注入bean的属性
- 使用dom4j:读取spring配置文件,实例化bean对象并注入依赖对象
- SpringMVC 源代码深度解析 IOC容器(Bean实例化和依赖注入)
- SpringMVC 源代码深度解析 IOC容器(Bean实例化和依赖注入)
- java创建的对象存储在哪儿
- 干货 | Spark入门到精通(001)
- 引用与指针的区别
- 如何生成pkcs12
- iOS注册远程推送消息证书后提示此证书签发者无效的解决办法
- 依赖注入之Bean的实例化
- UI控件--UIImageView
- Laravel5.2中出现的问题
- Linux笔记(21)——格式化分区
- curl伪造reffer抓取图片资源的方法
- linux根路径下各文件夹的作用
- 《NumPy Beginner's Guide》笔记Chapter2
- 使用right jion on group by 出现的问题
- BZOJ 2395 Balkan 2011 Time is Money 最小乘积生成树