依赖注入实现了控制反转的思想。
Spring通过依赖注入的方式来完成Bean管理的。
Bean管理说的是:Bean对象的创建,以及Bean对象中属性的赋值(或者叫做Bean对象之间关系的维护)。
依赖注入:
-
依赖指的是对象和对象之间的关联关系。
-
注入指的是一种数据传递行为,通过注入行为来让对象和对象产生关系。
依赖注入常见的实现方式包括两种:
-
第一种:set注入
-
第二种:构造注入
3.1 set注入
set注入底层通过反射调用set方法给属性赋值 前提是一定要有set方法 不然直接报错
在bean里面 多一个标签
<property> 这个标签就代表着属性赋值
-
name是 set方法去掉set并且首字母小写
-
ref 是依赖的对象 填的内容是根据容器里的bean id来填的
3.2 构造注入
构造注入原理:通过调用构造方法来执行
以这个bean类来做演示 (该类没有使用set注入 只使用了构造方法)
3.2.1第一种
<bean id="vipDao" class="com.Constructor.Dao.VipDao"></bean> <!-- 构造注入第一种方式 这里index参数表示构造方法的第几个参数 根据索引来规定 ref表示依赖的类 其实也就是构造方法里面的参数--> <bean id="vipService" class="com.Constructor.Service.VipService"> <constructor-arg index="0" ref="vipDao"></constructor-arg> </bean>
与set注入不同的是 构造注入引用的标签不再是<property> 而是<constructor>
-
index 指的是构造方法里参数的索引
-
ref 同set注入一样 所依赖的对象 依旧是bean的具体id
3.2.2第二种
<!-- 构造注入第二钟方式 这里name指的是构造方法中具体的参数名 ref依旧是里面具体传的参数 --> <bean id="vipService2" class="com.Constructor.Service.VipService"> <constructor-arg name="canshuming" ref="vipDao"></constructor-arg> </bean>
第二种怎么说呢 感觉有点点随意 就还是和代码有耦合了
-
name 代表具体的参数名
3.2.3第三种
<!-- 第三种注入方式 直接不指定index和name 直接传一个实参让idea自动匹配 --> <bean id="vipService3" class="com.Constructor.Service.VipService"> <constructor-arg ref="vipDao"></constructor-arg> </bean>
第三种方式就很简单粗暴 直接没有name属性或者index属性 直接传参数让idea自行判断
3.3总结
其实无论是set注入还是构造注入 底层都是通过反射来给属性赋值