第4.34课 上课 IoC(控制反转)&DI(依赖注入), 依赖注入
4_34

IoC(控制反转)&DI(依赖注入)
名词解释:IoC(控制反转)与DI(依赖注入)
Rod Johnson: IoC(控制反转)
Martin Fowler: 起个新名字,DI(依赖注入).
假设要找妹子:(A组件依赖B组件)
1.自己主动造一个。 自己new一个B组件.
2.通过中介、婚姻市场(工厂)去主动获取一个.【工厂模式】.
3.长大了,需要妹子时,家庭、社会会自动配置一个妹子。只要被动接受被依赖组件即可——这就是Spring.
不用Spring时(无论是自己去new、还是通过工厂获取),都需要主动去获取被依赖组件,
用了Spring之后, 程序只要被动等待容器注入被依赖组件—— 由主动获取,变成了被动接受, 控制关系反过来。
依赖注入:当A依赖B时, 用了Spring之后,A不再主动去找B,而是被动接受容器的注入,
从A的角度来说,此时控制关系被反过来了,因此被称为控制反转.
从容器角度来看,容器将被依赖的B注入到A中, 容器作的事情就是注入依赖组件,
所以称为依赖注入。
依赖注入
依赖注入可分为三种:
- 设值注入: 通过<perperty.../>调用setter方法.
- 构造器注入: 通过<constructor-arg.../>调用有参的构造器.
- 接口注入: 很少用.
设值注入
设值注入: 通过<perperty.../>调用setter方法
第一种形式:
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
property : 属性设值注入调用setXxx方法
-->
<bean id="studentService" class="com.yayadou.spring.StudentService">
<!-- 设值注入 setUserName()-->
<property name="userName">
<value>李明</value>
</property>
<!-- 设值注入 setAge()-->
<property name="age">
<value>20</value>
</property>
</bean>
第二种形式(省略)
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
property : 属性设值注入调用setXxx方法
-->
<bean id="studentService2" class="com.yayadou.spring.StudentService">
<!-- 设值注入 setUserName()-->
<property name="userName" value="张明"/>
<!-- 设值注入 setAge()-->
<property name="age" value="20"/>
</bean>
property属性元素
property: 驱动调用setter方法.
说明:只要你会查api,看到该类有setter方法,你就可以配置对应的property元素.
<value/>标量类型
<!-- 设值注入 -->
<property name="age">
<value>20</value>
</property>
<array/>数组类型
<!-- 为数组类型 value-type:指定数组元素类型 -->
<array value-type="java.lang.String">
<value>广州市</value>
<value>深圳市</value>
<value>珠海市</value>
</array>
<set/>Set集合类型
<!-- 为集合类型 value-type:指定集合元素类型 -->
<set value-type="int">
<value>100</value>
<value>200</value>
<value>300</value>
</set>
<map/>Map集合类型
<!-- 为Map集合类型 key-type: 指定key的类型 value-type:指定value的类型 -->
<map key-type="int" value-type="java.lang.String">
<entry key="1" value="李小一"/>
<entry key="2" value="李小二"/>
</map>
<props/>Properties集合类型
<!-- 为Properties集合类型 value-type:指定属性值类型 -->
<props value-type="java.lang.String">
<prop key="001">中山市</prop>
<prop key="002">惠州市</prop>
</props>
<bean/>bean类型
<!-- 指定第一个参数为bean(嵌套bean) -->
<bean class="com.yayadou.spring.HelloService">
<!-- 指定构造器中第一个参数 -->
<constructor-arg type="java.lang.String">
<value>李小二</value>
</constructor-arg>
<!-- 指定构造器中第二个参数 -->
<constructor-arg type="int">
<value>19</value>
</constructor-arg>
</bean>
<list/>List集合类型
<!-- 为集合类型 value-type:指定集合元素类型 -->
<list value-type="java.lang.String">
<value>广州市</value>
<value>深圳市</value>
<value>珠海市</value>
</list>
依赖注入
依赖注入可分为三种:
- 设值注入: 通过<perperty.../>调用setter方法.
- 构造器注入: 通过<constructor-arg.../>调用有参的构造器.
- 接口注入: 很少用.
构造器注入
通过<constructor-arg.../>调用有参的构造器
第一种形式:
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
constructor-arg: 指定构造器中的参数 type:指定参数类型
-->
<bean id="helloService" class="com.yayadou.spring.HelloService">
<!-- 指定构造器中第一个参数 -->
<constructor-arg type="java.lang.String">
<value>李小一</value>
</constructor-arg>
<!-- 指定构造器中第二个参数 -->
<constructor-arg type="int">
<value>18</value>
</constructor-arg>
</bean>
第二种形式:
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
constructor-arg: 指定构造器中的参数
-->
<bean id="userService" class="com.yayadou.spring.UserService">
<!-- 指定构造器中第一个参数 -->
<constructor-arg>
<!-- 为数组类型 value-type:指定数组元素类型 -->
<array value-type="java.lang.String">
<value>广州市</value>
<value>深圳市</value>
<value>珠海市</value>
</array>
</constructor-arg>
<constructor-arg type="java.lang.String">
<value>李小二</value>
</constructor-arg>
</bean>
第三种形式:
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
constructor-arg: 指定构造器中的参数
-->
<bean id="personService" class="com.yayadou.spring.PersonService">
<!-- 指定构造器中第一个参数 -->
<constructor-arg>
<!-- 为集合类型 value-type:指定集合元素类型 -->
<list value-type="java.lang.String">
<value>广州市</value>
<value>深圳市</value>
<value>珠海市</value>
</list>
</constructor-arg>
<!-- 指定构造器中第二个参数 -->
<constructor-arg>
<!-- 为集合类型 value-type:指定集合元素类型 -->
<set value-type="int">
<value>100</value>
<value>200</value>
<value>300</value>
</set>
</constructor-arg>
<!-- 指定构造器中第三个参数 -->
<constructor-arg>
<!-- 为Properties集合类型 value-type:指定属性值类型 -->
<props value-type="java.lang.String">
<prop key="001">中山市</prop>
<prop key="002">惠州市</prop>
</props>
</constructor-arg>
<!-- 指定构造器中第四个参数 -->
<constructor-arg>
<!-- 为Map集合类型 key-type: 指定key的类型 value-type:指定value的类型 -->
<map key-type="int" value-type="java.lang.String">
<entry key="1" value="李小一"/>
<entry key="2" value="李小二"/>
</map>
</constructor-arg>
</bean>
constructor-arg构造器元素
constructor-arg: 配置构造器参数.
该元素可配置type属性,如果不指定type属性,该配置参数优先被当成String处理.
<value/>标量类型
<constructor-arg type="java.lang.String">
<value>李小二</value>
</constructor-arg>
<array/>数组类型
<!-- 为数组类型 value-type:指定数组元素类型 -->
<array value-type="java.lang.String">
<value>广州市</value>
<value>深圳市</value>
<value>珠海市</value>
</array>
<list/>List集合类型
<!-- 为集合类型 value-type:指定集合元素类型 -->
<list value-type="java.lang.String">
<value>广州市</value>
<value>深圳市</value>
<value>珠海市</value>
</list>
<set/>Set集合类型
<!-- 为集合类型 value-type:指定集合元素类型 -->
<set value-type="int">
<value>100</value>
<value>200</value>
<value>300</value>
</set>
<map/>Map集合类型
<!-- 为Map集合类型 key-type: 指定key的类型 value-type:指定value的类型 -->
<map key-type="int" value-type="java.lang.String">
<entry key="1" value="李小一"/>
<entry key="2" value="李小二"/>
</map>
<props/>Properties集合类型
<!-- 为Properties集合类型 value-type:指定属性值类型 -->
<props value-type="java.lang.String">
<prop key="001">中山市</prop>
<prop key="002">惠州市</prop>
</props>
<bean/>bean类型
<!-- 指定第一个参数为bean(嵌套bean) -->
<bean class="com.yayadou.spring.HelloService">
<!-- 指定构造器中第一个参数 -->
<constructor-arg type="java.lang.String">
<value>李小二</value>
</constructor-arg>
<!-- 指定构造器中第二个参数 -->
<constructor-arg type="int">
<value>19</value>
</constructor-arg>
</bean>
constructor-arg构造器元素简化配置
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
constructor-arg: 指定构造器中的参数 type:指定参数类型 value:指定值
-->
<bean id="helloService" class="com.yayadou.spring.HelloService">
<!-- 指定构造器中第一个参数 -->
<constructor-arg type="java.lang.String" value="李小一"/>
<!-- 指定构造器中第二个参数 -->
<constructor-arg type="int" value="18"/>
</bean>
<!-- 配置Bean:
id : Bean的唯一标识符
class : 指定类(包名 + 类名)
constructor-arg: 指定构造器中的参数 ref:指定引用bean的id值
-->
<bean id="studentService" class="com.yayadou.spring.StudentService">
<!-- 构造器中第一个参数 -->
<constructor-arg ref="helloService"/>
</bean>
浙公网安备 33010602011771号