针对于每一个Java的爱好者而言,无论是从事面向于微服务架构技术的领域(SpringCloud、SpringCloud-Alibaba等),还是面向于传统互联网行业(SpringBoot)以及软件系统(Spring\SpringBatch)领域,掌握好Spring框架技术原理和源码对排查问题以及未来的面试技术有着非常重要的帮助和影响,而接下来,笔者会针对于Spring的技术框架的核心源码流程点进行相关的分析和认识,相信阅读完本篇文章,一定会对Spring的源码和执行原理有着很大的帮助和提升。
IOC容器执行流程主要核心流程点:
第二步将存在根据 名称或者别名进行获取相关的缓存池找那个进行获取相关的对象实例
如果存在:Spring框架会调用getObjectForBeanInstance方法,返回对应的Bean实例对象,其中Bean实例的类型有两种模式:单例模式和原型模式
单例模式:缓存中没有,创建一个,然后放入缓存中,其中会对该单例对象bean进行先关的拦截和后置工作。
原型模式:每次都会创建新的对象进行返回相关的对象。
如果当前的容器中,无法获取到相关的对应的BeanName的对象实例,则会进行想父容器进行寻找对应的对象Bean实例,如果父容器中存在,直接返回父容器中的数据对象实例,但是如果父容器还不存在,则会进行创建Bean对象实例了,但是在创建之前,会进行解析两种特殊的Bean操作关系。
createBean的方法入口,getSIngleton方法:
先从singletonObjects集合中获取相关的Bean实例,若不为空,则直接返回。
如果获取不到相关的对象实例在一级单例缓存池中,则会进行createBeanInstance实例阶段(此部分,接下来会详细介绍),会将对应的BeanName添加到singleCurrentlyInCreation集合中,这个集合主要用于存放相关的将要创建的对象bean,这个是第一步。
当通过getObject方法调用createBean方法的是创建实例对象的完成之后,会将对象实例从singleCurrentlyInCreation集合中进行转移到singleObjects对象集合缓存池中,映射关系为:beanName->singleObject对象。
解析Bean的类型和属性类型特点分析,主要分为以下几点内容:
校验和分析处理相关的override注解修饰的方法,主要用于先去校验和分析是否存在重载方法或者覆盖方法,方便cglib动态代理的时候不需要进行校验,而是直接处理调用即可。
其中有一个属性:lookup-method,如果我们希望在单例对象里面加入一个原型模式(prototype)的对象属性,那么可以考虑使用<lookup-method name="getPrototypeBean", bean = "prototypeBean" /> ApplicationContextAware。
bean实例化前的后置处理控制hook钩子函数以及相关回调机制控制。
主要通过createBeanInstance方法实例机制,其核心流程为:
在此我们会采用construct的方式进行反射进行构建实例对象,并且返回对象的对象结果,步骤如下:
核心: 我们前面已经将构造器列表进行排序完成后,会进行筛选获取合适的构造器进行执行构建对象。如果我们获取到了一个含有参数的构造器,那么spring框架会怎么做?
先进行获取相关构造器中的所有相关的形式参数的名称以及类型。
在进行解析参数,此解析方式会将对一些已经保存在容器中的数据进行解析注入以及相关的类型参数转换机制。
从而计算构造器与数值类型的差异性,选择最佳何时的构造器方法。
当我们已经筛选出和是的构造方法(最终),如果在此使用创建bean对象实例的时候,可以直接使用,无需在进行筛选。
之后我们采用初始化策略进行构建该实例bean对象。
最后将该对象注入到我们的BeanWrapperImpl对象模型中,并返回对象。
那么会采用组合方式进行构建该对象
为了方便我们进行在对Springbean容器的对象进行AOP拦截操作处理机制。
话不多说,就是提前暴露,可以通过factory避过去以及@lazy不会引起错误等。
主要的方法为populateBean方法
首先会获取相关的注入该类对象bean的属性列表,我们再切定义为pvs。
主要通过参数名或者参数类型进行解析并且填充相关的依赖属性,主要可以通过的手段就是@Autowired或者@Resource、@Inject等。
会将属性应用到bean中的applyProperyValues方法:
在检测属性值是否已经完成转换,如果该属性值已经完成转换,则直接使用,无需再次转换。
遍历属性列表,解析器属性的原始值,在通过PropertisSourcePlaceholdConfigurer进行相关的解析操作,并且完成解析值resolveValue。
最后将的到的解析数值resolveValue进行相关的类型属性转换操作。
将类型转换后的值设置到PropertyValue对象中,将PropertyValue对象存入deepCopy集合中,并且将deepCopy的属性值注入到bean对象中。
就是单纯的将bean名称进行注入到相关的非简单类型的注入机制。
主要是经历了所有的实例化和处理之后,则会需要进行相关的初始化方法的调用,在底层框架表现为initializeBean方法进行初始化,执行顺序的判断逻辑执行流程为:
极限就是为了超越而存在的
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.cnblogs.com/liboware/p/15777967.html
内容来源于网络,如有侵权,请联系作者删除!