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

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

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

spring依赖注入底层原理与源码分析_第1张图片

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

image-20210511170756835

autowrire参数:

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

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

spring依赖注入底层原理与源码分析_第2张图片

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

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

spring依赖注入底层原理与源码分析_第3张图片

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

spring依赖注入底层原理与源码分析_第4张图片

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

@Autowired注入点

调用后这个方法

spring依赖注入底层原理与源码分析_第5张图片

spring依赖注入底层原理与源码分析_第6张图片

spring依赖注入底层原理与源码分析_第7张图片

也会去注入父类的注入点

spring依赖注入底层原理与源码分析_第8张图片

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

@Autowired的加value值注入

spring依赖注入底层原理与源码分析_第9张图片

$占位符填充值

spring依赖注入底层原理与源码分析_第10张图片

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

spring依赖注入底层原理与源码分析_第11张图片

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

spring依赖注入底层原理与源码分析_第12张图片

会调用你的类型转换器

@Autowired的普通注入

spring依赖注入底层原理与源码分析_第13张图片会将注入的属性,属性名称为Map的String,属性值为Map的Object

@Autowired的collection,map,Array 注入

map使用

spring依赖注入底层原理与源码分析_第14张图片

collection

spring依赖注入底层原理与源码分析_第15张图片

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

@Autowired的Primary注解

spring依赖注入底层原理与源码分析_第16张图片

spring依赖注入底层原理与源码分析_第17张图片

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

spring依赖注入底层原理与源码分析_第18张图片

设置优先级

image-20210531104814925

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

你可能感兴趣的:(spring,spring)