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. 构造方法注入

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring