5 Spring依赖注入源码-CSDN博客
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1 Spring中到底有几种依赖注入的方式
1.1 手动注入
通过set方法进行注入
<bean name="userService" class="com.luban.service.UserService">
<property name="orderService" ref="orderService"/>
</bean>
构造方法进行注入
<bean name="userService" class="com.luban.service.UserService">
<constructor‐arg index="0" ref="orderService"/>
</bean>
1.2 自动注入
XML的autowire自动注入
自动注入模式
1. byType
2. byName
3. constructor
4. default
5. no
例
<bean id="userService" class="com.luban.service.UserService" autowire="byType"/>
这么写表示Spring会自动的给userService中所有的属性自动赋值不需要这个属性上有@Autowired注解但需要这个属性有对应的set方法
在创建Bean的过程中在填充属性时Spring会去解析当前类把当前类的所有方法都解析出来Spring会去解析每个方法得到对应的PropertyDescriptor对象PropertyDescriptor中有几个属性
1. name这个name并不是方法的名字而是拿方法名字进过处理后的名字
i. 如果方法名字以“get”开头比如“getXXX”,那么name=XXX
ii. 如果方法名字以“is”开头比如“isXXX”,那么name=XXX
iii. 如果方法名字以“set”开头比如“setXXX”,那么name=XXX
2. readMethodRef表示get方法的Method对象的引用
3. readMethodName表示get方法的名字
4. writeMethodRef表示set方法的Method对象的引用
5. writeMethodName表示set方法的名字
6. propertyTypeRef如果有get方法那么对应的就是返回值的类型如果是set方法那么对应的就是set方法中唯一参数的类型
get方法的定义是 方法参数个数为0个并且 方法名字以"get"开头 或者 方法名字以"is"开头并且方法的返回类型为boolean
set方法的定义是方法参数个数为1个并且 方法名字以"set"开头并且方法返回类型为void
autowire的byType和byName
Spring在通过byName的自动填充属性时流程是
1. 找到所有set方法所对应的XXX部分的名字
2. 根据XXX部分的名字去获取bean
Spring在通过byType的自动填充属性时流程是
1. 获取到set方法中的唯一参数的参数类型并且根据该类型去容器中获取bean
2. 如果找到多个会报错
constructor
spring利用构造方法的参数信息从Spring容器中去找bean找到bean之后作为参数传给构造方法从而实化得到一个bean对象并完成属性赋值
构造方法注入相当于byType+byName普通的byType是根据set方法中的参数类型去找bean找到多个会报错而constructor就是通过构造方法中的参数类型去找bean如果找到多会根据参数名确定
为什么我们平时都是用的@Autowired注解呢而没有用上文说的这种自动注入方式呢
@Autowired注解相当于XML中的autowire属性的注解方式的替代
XML中的autowire控制的是整个bean的所有属性而@Autowired注解是直接写在某个属性、某个set方法、某个构造方法上的
那么XML的自动注入底层其实也就是:
1. set方法注入
2. 构造方法注入
@Autowired注解的自动注入
= byType和byName的结合
@Autowired注解可以写在
1. 属性上先根据属性类型去找Bean如果找到多个再根据属性名确定一个
2. 构造方法上先根据方法参数类型去找Bean如果找到多个再根据参数名确定一个
3. set方法上先根据方法参数类型去找Bean如果找到多个再根据参数名确定一个
而这种底层到了
1. 属性注入
2. set方法注入
3. 构造方法注入