DI(依赖注入)
1.DI概念
DI即依赖注入,就是将SpringIOC创建的对象进行属性的设置。
DI有两种方式:
设置器注入
构造器注入
2.设置器注入
利用javabean的set方法进行属性注入
保证javabean的属性具有set设置器:
特别注意,类属性 不等于 javabean的bean属性
javabean的bean属性只看是否提供了set或get方法
a.基本类型的注入
基本数据类型、String类型性
<!--基本类型(基本数据类型、String类型)设置-->
<property name="name"value="zs"></property>
<property name="age"value="19"></property>
b.集合类型的注入
<!--集合类型-->
<property name="list">
<list>
<value>v1</value>
<value>v2</value>
<value>v3</value>
</list>
</property>
<property name="set">
<set>
<value>v1</value>
<value>v2</value>
<value>v3</value>
<value>v2</value>
</set>
</property>
c.map类型注入
<!--Map类型-->
<property name="map">
<map>
<entrykey="k1"value="v1"></entry>
<entrykey="k2"value="v2"></entry>
<entrykey="k3"value="v3"></entry>
<entrykey="k2"value="v4"></entry>
</map>
</property>
d.Properties类型注入
<!--Properties-->
<property name="props">
<props>
<propkey="pk1">pv1</prop>
<propkey="pk2">pv2</prop>
<propkey="pk3">pv3</prop>
</props>
</property>
e.自定义bean的注入
<bean id="dog"class="cn.xxxx.domain.Dog">
<propertyname="name"value="旺财"></property>
<propertyname="age"value="5"></property>
</bean>
<bean id="cat"class="cn.xxxx.domain.Cat">
<propertyname="name"value="汤姆"></property>
<propertyname="age"value="4"></property>
</bean>
<bean id="hero"class="cn.xxxx.domain.Hero">
<propertyname="name"value="亚瑟"></property>
<propertyname="age"value="55"></property>
<propertyname="dog"ref="dog"></property>
<propertyname="cat"ref="cat"></property>
</bean>
f.自定义bean的注入 - 自动装配
byName | 根据当前bean的bean属性名寻找该id的bean进行注入 |
---|---|
byTaype | 根据当前bean的bean属性类型寻找该类型的bean记性注入,这种方式如果找到多个bean则抛出异常 |
<bean id="dog"class="cn.xxxx.domain.Dog">
<propertyname="name"value="旺财"></property>
<propertyname="age"value="5"></property>
</bean>
<bean id="cat"class="cn.xxxx.domain.Cat">
<propertyname="name"value="汤姆"></property>
<propertyname="age"value="4"></property>
</bean>
<bean id="tiger1"class="cn.xxxx.domain.Tiger">
<propertyname="name"value="跳跳虎"></property>
<propertyname="age"value="9"></property>
</bean>
<bean id="tiger2"class="cn.xxxx.domain.Tiger">
<propertyname="name"value="小帅虎"></property>
<propertyname="age"value="8"></property>
</bean>
<!--
自动装配-自动进行自定义bean类型的属性设置byName
找到和当前bean的javabean属性名相同的id的bean,自动设置byType
找到和当前bean的javabean属性类型相同的bean,自动设置
**由于Spring容易可以配置多个id不同但类型相同的bean,所以通过ByType方式自动装配bean的时候,有可能同一个属性找到多个对应的bean,此时会抛出异常
-->
<bean id="hero"class="cn.xxxx.domain.Hero"autowire="byType">
<propertyname="name"value="亚瑟"></property>
<propertyname="age"value="55"></property>
<!--
<propertyname="dog"ref="dog"></property>
<propertyname="cat"ref="cat"></property>
<propertyname="tiger"ref="tiger"></property>
-->
</bean>
3.基于构造器的注入
有的bean没有set方法而是通过构造方法进行属性设置的,此时Spring同样支持通过构造 器进行属性注入。
package cn.xxxx.domain;
public class Person {
private String name;
private int age;
private Dog dog;
public Person() {
}
public Person(String name, int age, Dog dog) {
this.name = name;
this.age = age;
this.dog = dog;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", dog=" + dog +
'}';
}
}
进行配置:
<bean id="dog" class="cn.xxxx.domain.Dog">
<property name="name" value="旺财"></property>
<property name="age" value="5"></property>
</bean>
<bean id="person" class="cn.xxxx.domain.Person">
<!--
name:为构造器中的哪个名字的参数设定值
type:为构造器中的哪个类型的参数设定值
index:为构造器中第几个参数设定值,以0开始
value:为该属性设定什么值
ref:如果参数为自定义bean类型,通过ref引用自定义bean类型
-->
<constructor-arg name="name" type="java.lang.String" index="0" value="zs" ></constructor-arg>
<constructor-arg name="age" value="19"></constructor-arg>
<constructor-arg index="2" ref="dog"></constructor-arg>
</bean>
大家看到这里是不是会觉得框架不是说很方便吗?怎么这么麻烦。下次我们开始说注解方式的实现。今天先到这里,我们下次见。
------在下亦从文,弃武从文