Spring的依赖注入(DI)
依赖注入:Dependency Injection
##
1、Ioc的作用:
降低程序间的耦合(依赖关系)
2、依赖关系管理:
交给spring来维护,在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明;
3、依赖关系的维护:依赖注入
能注入的数据(三类):
1、基本类型和String 2、其他的bean类型(在配置文件中或者注解配置过的bean)
注入的方式(三种):
1、构造函数提供:
优点:
再获取对象的时候,必须注入数据,否则无法创建成功
缺点:
改变了bean对象的实例化方式,使我们在创建对象的时候,即便用不到某些属性,也必须提供
实现:
1、beans.xml
<!--
依赖注入
构造函数注入:
使用的标签:constructor-arg
属性:
type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
index:用于指定要注入的数据,给构造函数中指定索引位置的参数赋值,索引从0开始
name:用于指定给构造函数中指定名称的参数赋值 =====》常用的
==================以上三个用于指定给构造函数中那个参数赋值==================================
value:用于给基本类型和String类型赋值数据
ref:通过xml配置文件根据id找bean 引用关联的bean对象
优点:
在获取bean对象时,注入数据是必须的操作,否则对象时无法创建成功的
弊端
改变了bean对象的实例化方式,使我们再创建对象时,如果用不到这些数据,也必须提供
-->
<bean id="Service" class="com.tfs.service.impl.ServiceImpl">
<constructor-arg name="dao" ref="Dao">
</constructor-arg>
</bean>
2、ServiceImpl.java
private Dao dao;
/**
* 构造函数注入
*/
public ServiceImpl(Dao dao) {
this.dao = dao;
}
public void say() {
System.out.println("Service say hello ");
dao.say();
}
3、测试类、控制台
public static void main(String[] args){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Service service = applicationContext.getBean("Service", Service.class);
service.say();
}
2、使用set方法提供:
优点:
创建对象时,没有明确的限制,可以使用默认构造函数
缺点:
如果有某个成员必须有值,则获取对象时,有可能set方法没有执行
实现:
1、beans.xml
<!--
依赖注入
2、set方法注入:常用
涉及的标签:property
标签的属性:
name:用于指定注入时所调用的,set方法指定的属性 注意,通过set方法必须与属性名称一致,name 就必须是setName,spring通过set方法给对应的参数赋值
value:用于给基本类型和String类型赋值数据
ref:通过xml配置文件根据id找bean 引用关联的bean对象
优势:创建对象时,没有明确的限制,可以使用默认构造函数
弊端:如果有某个成员必须有值,则获取对象时,有可能set方法没有执行
-->
<bean id="Service" class="com.tfs.service.impl.ServiceImpl">
<property name="dao" ref="Dao">
</property>
</bean>
2、ServiceImpl.java
private Dao dao;
/**
* set方法注入
*/
public void setDao(Dao dao) {
this.dao = dao;
}
public void say() {
System.out.println("Service say hello ");
dao.say();
}
3、测试类、控制台
public static void main(String[] args){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Service service = applicationContext.getBean("Service", Service.class);
service.say();
}
3、使用注解提供
δ、复杂类型的注入/集合类型
1、注意事项( 结构相同,标签可以互换)
第一类:用于给list结构集合注入的标签:
list array set
第二类:用于map结构的集合注入的标签:
map properties
2、实现
beans.xml
<!--
复杂类型的注入/集合类型注入
用于给list结构集合注入的标签:
list array set
用于map结构的集合注入的标签:
map properties
结构相同,标签可以互换
-->
<bean id="Service" class="com.tfs.service.impl.ServiceImpl">
<property name="dao" ref="Dao">
</property>
<property name="list">
<list>
<value>111</value>
<value>111</value>
<value>111</value>
</list>
</property>
<property name="string">
<array>
<value>111</value>
<value>111</value>
<value>111</value>
</array>
</property>
<property name="map">
<map>
<entry key="11" value="12"></entry>
<entry key="13">
<value>14</value>
</entry>
</map>
</property>
<property name="props">
<props>
<prop key="11" >ccc</prop>
<prop key="11" >dddd</prop>
</props>
</property>
</bean>
ServiceImpl.java
private String string[];
private List<String> list;
private Map<String,String> map;
private Properties props;
public void setProps(Properties props) {
this.props = props;
}
public void setString(String[] string) {
this.string = string;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, String> map) {
this.map = map;
}