电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

spring源碼學習之bean的初始化以及循環引用

瀏覽:88日期:2023-08-10 16:02:30

實例化方法,把bean實例化,并且包裝成BeanWrapper

1、點進這個方法里面。

spring源碼學習之bean的初始化以及循環引用

這個方法是反射調用類中的 factoryMethod 方法。 這要知道@Bean 方法的原理, 實際上spring 會掃描有@bean 注解的方法, 然后把方法名稱設置到 BeanDefinition 的 factoryMethod屬性中, 接下來就會調到上面截圖中的方法實現@Bean 方法的調用。

2、 有參構造函數的時候

spring源碼學習之bean的初始化以及循環引用

determineConstructorsFromBeanPostProcessors這個方法是 BeanPostProcessor 接口類的首次應用, 最終會掉到AutowiredAnnotationBeanPostProcessor 類的方法, 在方法中會掃描有注解的構造函數然后完成裝配過程。 然后把有有@Autowired 注解的構造函數返回。

3、 無參構造函數的實例化

spring源碼學習之bean的初始化以及循環引用

這就是簡單的反射實例化。 大部分類的實例化都會走這個邏輯

4、 類中注解的收集

實例化完成后接下來就需要對類中的屬性進行依賴注入操作, 但是類里面屬性和方法的依賴注入往往用@Autowired 或者@Resource 注解, 那么這些注解的依賴注入是如何完成的呢?

注解的收集:

spring源碼學習之bean的初始化以及循環引用

也是通過 BeanPostProcessor 接口類型實例來挨個處理的。

A、 首先是CommonAnnotationBeanPostProcessor 類, 這個類完成了@Resource 注解的屬性或者方法的收集

這個類還對@PostConstruct 和@PreDestory 支持

spring源碼學習之bean的初始化以及循環引用

收集過程

1、 看緩存里面有沒有 InjectionMetadata 對象

2、 從類中獲取所有 Field 對象, 循環 field 對象, 判斷 field 有沒有@Resource 注解,如果有注解封裝成 ResourceElement 對象

3、 從類中獲取所有 Method 對象, 循環 Method 對象, 判斷 Method 有沒有@Resource

注解, 如果有注解封裝成 ResourceElement 對象

4、 最終把兩個 field 和 Method 封裝的對象集合封裝到 InjectionMetadata 對象中

B、 然后是AutowiredAnnotationBeanPostProcessor 類, 對@Autowired 注解的屬性和方法的收集。 收集過程基本上跟@Resource 注解的收集差不多, 這里就不贅述了

5、 IOCDI 依

對應的方法:

spring源碼學習之bean的初始化以及循環引用

spring源碼學習之bean的初始化以及循環引用

這里又是一個 BeanPostProcessor 類型接口的運用, 前面我們講到了@Resource@Autowired 注解的收集, 那么這個方法就是根據收集到的注解進行反射調用。

spring源碼學習之bean的初始化以及循環引用

循環收集到的 metaData 中的 list 對象, 然后挨個調用里面的 InjectedElement 的inject 方法完成依賴注入。

spring源碼學習之bean的初始化以及循環引用

其中 value 值的獲取, 如果依賴的屬性是一個引用類型必定會觸發該屬性的BeanFactory.getBean 操作, 從而從 spring 容器中獲取到對應的實例。 方法的依賴注入類似這里就不再贅述。

6、 bean 實例化后的操作

代碼走到這里:

spring源碼學習之bean的初始化以及循環引用

A、 首先是對某些 Aware 接口的調用

spring源碼學習之bean的初始化以及循環引用

B、 然后@PostConstruct 注解方法的調用

spring源碼學習之bean的初始化以及循環引用

這里又是一個 BeanPostProcessor 接口的運用,前面講過, 有@PostConstruct 注解的方法會收集到一個 met就是通過 BeanPostProcessor 接口調到CommonAnnotationBeanPostProcessor 類, 然后在類中拿根據對象里面的容器來反射調用有注解的方法。 代碼如下:

spring源碼學習之bean的初始化以及循環引用

spring源碼學習之bean的初始化以及循環引用

有@PostConstruct 注解的容器會收集到 initMethods 容器中, 接下來就是方法的

反射調用。

spring源碼學習之bean的初始化以及循環引用

C、 InitializingBean 接口和 init-method 屬性調用

spring源碼學習之bean的初始化以及循環引用

Init-method 屬性調用是在 afterPropertiesSet 之后

spring源碼學習之bean的初始化以及循環引用

afterPropertiesSet和Init-method和有@PostConstruct注解的方法其實核心功能都是一樣的, 只是調用時序不一樣而已, 都是在該類實例化和 IOC 做完后調用的, 我們可以在這些方法中做一些在 spring 或者 servlet 容器啟動的時候的初始化工作。 比如緩存預熱, 比如緩存數據加載到內存, 比如配置解析, 等等初始化工作。

在這個方法里面還有一個重要的邏輯

spring源碼學習之bean的初始化以及循環引用

也是一個 BeanPostProcessor 接口的運用, 在這里會返回 bean 的代理實例, 這個就是 AOP 的入口。

D、 FactoryBean 接口

帶入如下:

spring源碼學習之bean的初始化以及循環引用

在實例化和 IOC/DI 做完后, 就會調用 FactoryBean 類型的接口, 如果要獲取到FactoryBean 類本身, 就必須加上”&”符號, 比如beanFactory.getBean(“&beanName” )。

spring源碼學習之bean的初始化以及循環引用

BeanFactory.getBean(“beanName”)只能獲取到getObject()方法返回的實例。

getObject方法返回的實例會有單獨的緩存存儲, 跟其他實例不是同一個緩存, 對應的緩存是:factoryBeanObjectCache

E、 循環依賴

循環依賴請參照流程圖理解https://www.processon.com/view/link/5df9ce52e4b0c4255ea1a84f

循環依賴只會出現在單例實例無參構造函數實例化情況下

有參構造函數的加@Autowired 的方式循環依賴是直接報錯的, 多例的循環依賴也是直接報錯的

spring源碼學習之bean的初始化以及循環引用

spring源碼學習之bean的初始化以及循環引用

循環依賴步驟:

1、 A 類無參構造函數實例化后, 設置三級緩存

2、 A 類 populateBean 進行依賴注入, 這里觸發了 B 類屬性的 getBean 操作

3、 B 類無參構造函數實例化后, 設置三級緩存

4、 B 類 populateBean 進行依賴注入, 這里觸發了 A 類屬性的 getBean 操作

5、 A 類之前正在實例化, singletonsCurrentlyInCreation 集合中有已經有這個 A 類了, 三級緩存里面也有了, 所以這時候是從三級緩存中拿到的提前暴露的A 實例, 該實例還沒有進行 B 類屬性的依賴注入的, B 類屬性為空。

6、 B 類拿到了 A 的提前暴露實例注入到 A 類屬性中了

7、 B 類實例化已經完成, B 類的實例化是由 A 類實例化中 B 屬性的依賴注入觸發的 getBean 操作進行的, 現在 B 已經實例化, 所以 A 類中 B 屬性就可以完成依賴注入了, 這時候 A 類 B 屬性已經有值了

8、 B 類 A 屬性指向的就是 A 類實例堆空間, 所以這時候 B 類 A 屬性也會有值了。

總結

到此這篇關于spring源碼學習之bean的初始化以及循環引用的文章就介紹到這了,更多相關spring源碼bean的初始化及循環引用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 昆明化妆培训-纹绣美甲-美容美牙培训-昆明博澜培训学校 | WTB5光栅尺-JIE WILL磁栅尺-B60数显表-常州中崴机电科技有限公司 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 新疆十佳旅行社_新疆旅游报价_新疆自驾跟团游-新疆中西部国际旅行社 | 长江船运_国内海运_内贸船运_大件海运|运输_船舶运输价格_钢材船运_内河运输_风电甲板船_游艇运输_航运货代电话_上海交航船运 | 复盛空压机配件-空气压缩机-复盛空压机(华北)总代理 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 振动筛,震动筛,圆形振动筛,振动筛价格,振动筛厂家-新乡巨宝机电 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 河北凯普威医疗器材有限公司,高档轮椅系列,推车系列,座厕椅系列,协步椅系列,拐扙系列,卫浴系列 | 衢州装饰公司|装潢公司|办公楼装修|排屋装修|别墅装修-衢州佳盛装饰 | 永嘉县奥阳陶瓷阀门有限公司 | 广东青藤环境科技有限公司-水质检测 | 液压油缸-液压站生产厂家-洛阳泰诺液压科技有限公司 | 软启动器-上海能曼电气有限公司| 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 电动不锈钢套筒阀-球面偏置气动钟阀-三通换向阀止回阀-永嘉鸿宇阀门有限公司 | 小程序开发公司-小程序制作-微信小程序开发-小程序定制-咏熠软件 | 次氯酸钠厂家,涉水级次氯酸钠,三氯化铁生产厂家-淄博吉灿化工 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | 查分易-成绩发送平台官网| 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 煤棒机_增碳剂颗粒机_活性炭颗粒机_木炭粉成型机-巩义市老城振华机械厂 | 好笔杆子网 - 公文写作学习交流分享平台| 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 伸缩节_伸缩器_传力接头_伸缩接头_巩义市联通管道厂 | 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 卫浴散热器,卫浴暖气片,卫生间背篓暖气片,华圣格浴室暖气片 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 手术室净化厂家-成都做医院净化工程的公司-四川华锐-15年特殊科室建设经验 | 江苏农村商业银行招聘网_2024江苏农商行考试指南_江苏农商行校园招聘 | 家德利门业,家居安全门,别墅大门 - 安徽家德利门业有限公司 | 振动传感器,检波器-威海广达勘探仪器有限公司 | 扬尘监测_扬尘监测系统_带证扬尘监测设备 - 郑州港迪科技有限公司 |