第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>

posted on 2018-01-31 22:30  東風★破  阅读(180)  评论(0)    收藏  举报

导航