spring依赖注入底层原理与源码分析

Spring中有几种依赖注入方式?

1.手动注入-set方法注入和构造器注入

image-20210511162553533

2.自动注入-@Autowired注解和xml注入

image-20210511170756835

autowrire参数:

no默认不开启
byName根据被注入属性的名称作为 Bean 名称作为依赖查找,并将对象设置到该属性
byType根据被注入属性的类型作为依赖类型进行依赖查找,并将该对象设置到该属性
constructor特殊 byType 类型,用于构造器参数

autowrire -->@Autowire在后来升级:

image-20210512111416393

在调用这个xxx方法时会先去根据byType类型找有几个定义属性,有一个属性就可以直接返回值,如果有两个或者,两个以上的属性

就会根据byName的bean属性名去找,如果属性名不一样就不会找到,如果是一个属性就可以根据类型直接找到。举例:

image-20210512111723704

在日常开发中会用@Service直接定义类名,@Service会将类名首字母小写存入ioc容器中,所以一般都是唯一属性,需要多个定义建议使用bean来创建对象。

image-20210530202659428

在OrderService创建也是会先找ByType,在来找ByName

@Autowired注入点

调用后这个方法

image-20210530214613239

image-20210530214924708

也会去注入父类的注入点

image-20210530221201757

如果是static修饰的就直接返回

@Autowired的加value值注入

image-20210530223400353

$占位符填充值

image-20210530223533706

#spring里面的表达式可以写属性也可以进行运算

image-20210530224147302

直接注入字符串给类属性需要自己定义spring的类型转换器

image-20210530224259458

会调用你的类型转换器

@Autowired的普通注入

image-20210530224822405会将注入的属性,属性名称为Map<String,Object>的String,属性值为Map<String,Object>的Object

@Autowired的collection,map,Array 注入

map使用

image-20210531095307813

collection

image-20210531095631248

会拿出所有被加载到容器中的方法,map会实现以属性名小写,属性值形式返回,其他会直接返回属性。

@Autowired的Primary注解

image-20210530231613252

在多个实例时加上一个主bean,就会byType找,只找属性返回

image-20210531111246049

设置优先级

image-20210531104814925

@Autowired的流程是先找byType找到后》存入map中》如果有Priamary会返回值,根据优先级最高的返回,最后才会根据byName来获取属性,在byName中是根据Map的key,value形式获取,所有属性名字必须和注入的属性名称一致。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值