码农知识堂 - 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()方法结束

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

  • 相关阅读:
    简单实现.NET Hook与事件模拟
    关于numpy库的一些函数使用的记录
    B058-SpringBoot
    SPI_OLED模块操作方法
    并发编程-线程池ForkJoinPool(二)
    密码学与信息安全面试题及参考答案(2万字长文)
    Manifest merger failed
    如何阻止事件冒泡和默认事件
    论文阅读:Neural Graph Collaborative Filtering
    MySQL索引与事务
  • 原文地址:https://blog.csdn.net/aqin1012/article/details/127810423
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号