Spring源码分析之依赖注入(一)

本文深入探讨了Spring框架中的依赖注入,重点分析了@Bean注解的两种注入方式(AUTOWIRE_BY_NAME和AUTOWIRE_BY_TYPE),并详细阐述了@Autowired、@Resource注解的处理过程,包括查找注入点、属性注入的实现细节。文章适合对Spring源码感兴趣的开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

主要讲解了在依赖注入过程中, 注入点的获取和属性的注入。

二、前置学习

依赖注入的几种方式

@Bean注解注入(已废弃)

使用以下这种方式去注入, 源码分析会用到

自动注入

源码位置

实例化Bean方法: AbstractAutowireCapableBeanFactory.doCreateBean(), 在这个方法里面有一个属性填充的方法:

doCreateBean没印象或者不知道的, 建议从头开始看源代码, 从头走一遍, 才更清晰明了

点进去, 这个方法就是依赖注入相关源代码

三、@Bean注解注入分析

在我们的源码方法 populateBean里面, 有一段这样的代码

如果我们使用 @Bean(autowire = Autowire.BY_TYPE) 这种方式去注入的话, 那么就会进入上图中红框位置的 if判断

AUTOWIRE_BY_NAME

假设我们使用的是 @Bean(autowire = Autowire.BY_NAME)方式, 那么就会进入以下方法

unsatisfiedNonSimpleProperties方法

在上面的 autowireByName方法中, 又是通过了 unsatisfiedNonSimpleProperties(mbd, bw);方法去获取 Bean中能进行自动注入的属性名, 我们进入这个方法看一下

其中画红框的, 叫做属性描述器, 是由java.beans提供的, 在这里获取当前 Bean的类里面具体的属性和其getter, setter方法

当一个属性是 private作用域且有对应的 getter和 setter方法, 那么 java就认为他是一个真正的属性

接下来的流程判断什么样的属性能进行自动注入?:

  • 该属性有对应的set方法
  • 没有在ignoredDependencyTypes中
  • 如果该属性对应的set方法是实现的某个接口中所定义的,那么接口没有在ignoredDependencyInterfaces中
  • 属性类型不是简单类型,比如int、Integer、int[]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值