码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【自动注入·名称】autowireByName()详解


    【Spring源码系列- IOC】

    1

    【Spring源码】0.安装Gradle环境

    2

    【Spring源码】1.下载与编译_pom relocation to an other version number is not f

    3

    【Spring源码】2.试个水先~Debug找到传说中的三级缓存(图解向,堆图预警)

    4

    【Spring源码】3. xml文件如何转换成BeanDefinition(主要涉及prepareRefresh()+ obtainFreshBeanFactory()两个函数,图解向,堆图预警)_spring xml转bean

    5

    【Spring源码】4. 自己搞个标签?~自定义标签保姆级全过程(图解向,堆图预警)

    6

    【Spring源码】5.spring的bean工厂准备工作(prepareBeanFactory(beanFactory)

    7

    【Spring源码】6. Spring扩展自定义属性编辑器保姆级教程

    8

    【Spring源码】7. 如何添加自定义的BeanFactoryPostProcessor

    9

    【Spring源码】8. 捋下invokeBeanFactoryPostProcessors()主要处理流程

    10

    【Spring源码】9. 超级重要的ConfigurationClassPostProcessor

    11

    【Spring源码】10. 递归调用的processConfigurationClass()方法

    12

    【Spring源码】11. 我是注解类不?checkConfigurationClassCandidate()注解类判断方法详解

    13

    【Spring源码】12. 注册bean处理器registerBeanPostProcessors()

    14

    【Spring源码】13. 国际化处理initMessageSource()源码解析

    【补充内容】【保姆级】SpringBoot项目中的i18n国际化

    15

    【Spring源码】14. 消息多播器(观察者模式)

    【补充内容】【保姆级示例向】观察者模式

    16

    【Spring源码】15. Bean的创建过程(1.概述篇)

    17

    【Spring源码】16. Bean的创建过程(2)

    18

    【Spring源码】17.创建Bean这篇认真的@(・●・)@

    【补充内容】

    【保姆级·创建对象】如何通过Supplier创建对象

    【保姆级·创建对象】如何通过factory-method创建对象

    【保姆级·创建对象】如何利用resolveBeforeInstantiation()在预处理阶段返回一个Bean的实例对象

    19

    【Spring源码】18. factory-method创建对象关键函数详解:instantiateUsingFactoryMethod()

    20

    【Spring源码】19. 没合适的构造器?找determineCandidateConstructors()!

    21

    【Spring源码】20. MergedBeanDefinitionPostProcessor修改/合并bean定义

    【补充内容】

    【保姆级】@PostConstruct & @PreDestroy使用示例

    【Spring源码】AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()详解

    【Spring源码】CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()详解

    22

    【Spring源码】21. 初探循环依赖

    【补充内容】

    【保姆级】手把手Debug循环依赖的整体流程

    【实践向】当移除了三级缓存……

    【分析向】没有三级缓存会导致什么?

    【Spring源码】插播一个创建代理对象的wrapIfNecessary()方法

    23

    【Spring源码】22. 属性填充populateBean()详解

    【补充内容】

    【Spring源码】自动注入·名称:autowireByName()详解

    【Spring源码】自动注入·类型:autowireByType()详解

    【Spring源码】属性值的解析与赋值:populateBean().applyPropertyValues()

    【保姆级】超超超简单的自定义注解实现@Autowired同款功能

    24

    【Spring源码】23. 执行初始化逻辑:initializeBean()

    本文目录

    unsatisfiedNonSimpleProperties()

    什么是"简单"值类型?我们进入方法isSimpleValueType()

    isPrimitiveOrWrapper()

    ​isAssignableFrom()

    registerDependentBean()


    进入方法autowireByName()

    首先调用了unsatisfiedNonSimpleProperties()方法进行属性过滤

    unsatisfiedNonSimpleProperties()

    其中PropertyDescriptor是JavaBean通过存储器导出一个的一个属性,用于获取bw的所有属性描述对象,遍历获取到的属性描述对象,如果当前pd同时满足以下几点,则将该pd的属性名添加到result中

    • 有写入属性方法(pd.getWriteMethod() != null,即判断是否有setXxx()方法)

    • 未被排除在依赖检查项之外(!isExcludedFromDependencyCheck(pd))

    • pvs中没有该pd的属性名(!pvs.contains(pd.getName()))

    • 该pd的属性类型不是“简单类型”(!BeanUtils.isSimpleProperty(pd.getPropertyType()))

    满足以下任一条件返回true:

    1. "简单"值类型;

    2. 数组类型并且数组内的值为"简单"值类型

    什么是"简单"值类型?我们进入方法isSimpleValueType()

    这里的“简单”值类型需要同时满足三个条件:

    1. 值类型不为Void.class(Void.class != type)

    2. 值类型不为void.class(void.class != type)

    3. 满足以下条件任意:

    4. ClassUtils.isPrimitiveOrWrapper(type)

    5. Enum.class.isAssignableFrom(type)

    6. CharSequence.class.isAssignableFrom(type)

    7. Number.class.isAssignableFrom(type)

    8. Date.class.isAssignableFrom(type)

    9. Temporal.class.isAssignableFrom(type)

    10. URI.class == type

    11. URL.class == type

    12. Locale.class == type

    13. Class.class == type

    这里有两个方法需要介绍下(。・ω・。)ノ

    isPrimitiveOrWrapper()

    有没有客官感到疑惑🤔,方法名字叫判断是否是“简单”值类型,那么最简单的8大基本类型是在哪里进行判断的呢? 其中的isPrimitiveOrWrapper()方法通过isPrimitive()和isPrimitiveWrapper()两个方法,对是否为基本类型进行了判断

    • isPrimitive()

    ​isPrimitive()是一个底层方法(被native修饰),当type为8大基本类型或者Void类型时,isPrimitive()方法会返回true

    • ​isPrimitiveWrapper()

    ​isPrimitiveWrapper()也是一个底层方法(被native修饰),我们来看下primitiveWrapperTypeMap里面都有哪些类型,以及它是在哪里被赋值的

    ​isAssignableFrom()

    同样的,这个方法也是一个底层方法(被native修饰),它的作用是判断当前类是否是传入的参数类的父类、超接口,或者二者相同,满足任一情况则返回true

    最后unsatisfiedNonSimpleProperties()方法返回过滤出非简单类型的属性

    回到autowireByName()方法中,遍历属性名,如果该bean工厂有propertyName的beaDefinition或外部注册的singleton实例,就继续获取该工厂中该propertyName的bean对象,再将propertyName和该bean对象添加进pvs中,注册propertyName、beanName的依赖关系

    registerDependentBean()

    进入registerDependentBean()方法

    ​嘿嘿最后再来一个问题( ̄∇ ̄):集合dependentBeanMap和dependenciesForBeanMap的区别是?

    bean name to Set of dependent bean names. bean name to Set of bean names for the bean's dependencies.

    简单翻一下就是,一个放的是一个beanName和这个beanName所有依赖的beanNames;另一个放的是beanName和这个beanName所有依赖的bean对象 最后打印下🖨️追踪日志,registerDependentBean()方法结束

    今日份完成(。・ω・。)🎉🎉🎉ノ

  • 相关阅读:
    听说JetBrains要涨价,我赶紧把Goland续费到2025年!!!
    全面理解Web3.0时代
    实时数仓:实时数据平台之设计篇
    搞定面试官 - 可以介绍一下在 MySQL 中你平时是怎么使用 COUNT() 的嘛?
    动手学深度学习(2)-3.5 图像分类数据集
    曼哈顿距离和-打印菱形
    【数据结构练习题】二叉树(1)——1.相同的树2.另一颗树的子树3.翻转二叉树4.平衡二叉树5.对称二叉树
    高教社杯数模竞赛特辑论文篇-2023年C题:商超蔬菜销售数据的统计分析及建模(附获奖论文及R语言和LINGO代码实现)(续)
    记录路由配置之显示进度条
    CentOS7设置 redis 开机自启动
  • 原文地址:https://blog.csdn.net/aqin1012/article/details/127810423
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号