Spring的依赖注入

1. 手动注入

1.1 set方法注入

通过xml给bean设置property属性,需要提供set方法

<bean name="userService" class="com.wj.service.UserService">
	<property name="orderService" ref="orderService"/>
</bean>

1.2 构造方法注入

通过constructor-arg属性,需要提供构造方法

<bean name="userService" class="com.wj.service.UserService">
	<constructor-arg index="0" ref="orderService"/>
</bean>

2. 自动注入

2.1 自动注入模式

在BeanDefinition中有字段autowireMode,表示自动注入模式。
在这里插入图片描述
它可以通过beanDefinition指定,也可以通过xml指定,或者通过注解指定。不论哪种方式指定都会将值设置到beanDefinition中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
AbstractAutowireCapableBeanFactory.polulateBean()属性填充时,会从beanDefinition中拿到autowireMode的值,以下代码处理的是通过byType或byName注入。
在这里插入图片描述
byName和byType都需要提供set方法,所以它们的注入方式也是set方法注入。
通过byName的自动填充属性时流程是:

  1. 找到所有set方法所对应的XXX部分的名字
  2. 根据XXX部分的名字去获取bean

通过byType的自动填充属性时流程是:

  1. 获取到set方法中的唯一参数的参数类型,并且根据该类型去容器中获取bean
  2. 如果找到多个,会报错。

byConstructor:通过构造方法注入。 spring利用构造方法的参数信息从Spring容器中去找bean,找到bean之后作为参数传给构造方法,从而实例化得到一个bean对象,并完成属性赋值。 它结合了byType和byName,通过构造方法中的参数类型去找bean,如果找到多个会根据参数名确定。

通过autowireMode自动注入模式进行注入,它会把bean里所有的set方法都当做注入点,控制粒度不够细,使用@Autowired注解可以精确控制需要自动注入的字段或属性或构造方法。

2.2 @Autowired

在@Autowired注解中,没有byType或byName的概念,@Autowired是先根据类型找,如果找到多个则根据名字找。
它可以用在属性上、set方法上、构造方法上。
@Autowired注解是通过AutowiredAnnotationBeanPostProcessor来处理的,通过findAutowiringMetadata()方法来寻找注入点
在这里插入图片描述
再调用buildAutowiringMetadata()方法,首先遍历bean的所有属性Filed
如果被 @Autowired、@Value、@Inject中的任意一个标注,表示是一个注入点;
接着过滤掉static修饰的属性;获取@Autowired注解的required属性值;将字段封装到AutowiredFieldElement对象,并添加到注入点集合currElements中;
在这里插入图片描述

接着遍历bean的所有方法,如果当前方法是桥接方法,则找到原方法;
如果被 @Autowired、@Value、@Inject中的任意一个标注,表示是一个注入点;
接着过滤掉static修饰的属性;获取@Autowired注解的required属性值;将字段封装到AutowiredMethodElement对象,并添加到注入点集合currElements中;
在这里插入图片描述

重复以上步骤,处理bean的父类。
最后将currElements集合封装成一个InjectionMetadata对象,作为当前Bean对应的注入点集合对象,并缓存。

执行完这一系列操作后,只是把注入点缓存起来了,真正的注入是AutowiredAnnotationBeanPostProcessor.postProcessProperties()中调用的inject()方法通过反射进行的属性和方法的注入。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
参考:https://www.yuque.com/renyong-jmovm/spring/pb1xqg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值