IoC(DI 依赖注入)的两种方式
简介:
DI:Dependency Injection 依赖注入
IoC(依赖注入)的方式,也就是给Spring IoC容器中的bean赋值的方式,简称DI
DI有两种方式,接下来将详细解析
第一种方式:
Setter方式注入
最常用的注入方法,需要在xml配置文件中进行手动的配置.
要求:对象中的每个属性必须要有setter 方法
如何配置:需要为对象中的每个属性配置一个"property"标签:<property name="" />
其中name属性的值为对象中属性的名字.如何给属性注入值时,需要先确定该属性的类型
对象中的属性分为以下三种类型,不同的类型使用不同的注入方式
1):简单数据类型(八大基本类型,String,BigDecimal,Date等). 使用value.
2):引用数据类型(对象). 使用ref.
3):集合数据类型. 使用集合的元素.
Setter方式注入实例
简单数据类型
引用数据类型
集合数据类型
CollectionBean.java
package com.xiongluoluo.bean;
import lombok.*;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
* Created by Administrator on 2020/1/1 0001.
*/
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class CollectionBean {
/*集合数据类型*/
private Set<String> set;
private List<String> list;
private String[] array;
private Map<String, String> map;
private Properties prop;
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--private Set<String> set;
private List<String> list;
private String[] array;
private Map<String, String> map;
private Properties prop;-->
<!--Setter注入:为集合数据类型注入值的方式-->
<bean id="collectionBean" class="com.xiongluoluo.bean.CollectionBean">
<!--Setter注入:为Set集合注入值的方式-->
<property name="set">
<set>
<value>set1</value>
<value>set2</value>
<value>set3</value>
</set>
</property>
<!--Setter注入:为List集合注入值的方式-->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
<value>list3</value>
</list>
</property>
<!--Setter注入:为数组的注入值的方式-->
<property name="array">
<array>
<value>array1</value>
<value>array2</value>
<value>array3</value>
</array>
</property>
<!--Setter注入:为Map集合注入值的方式-->
<!--由于Map集合是双列集合,所以注入值的方式跟别的不太一样,
认真记忆一下即可-->
<property name="map">
<map>
<entry key="key1">
<value>value1</value>
</entry>
<entry key="key2">
<value>value2</value>
</entry>
<entry key="key3">
<value>value3</value>
</entry>
</map>
</property>
<!--为Properties集合注入值的方式-->
<!--Properties也是一个双列集合,与Map的类似,但又不太一样
认真观察-->
<property name="prop">
<props>
<prop key="prop1">prop1</prop>
<prop key="prop2">prop2</prop>
<prop key="prop3">prop4</prop>
</props>
</property>
</bean>
</beans>
SpringTest.java
package com.xiongluoluo.test;
import com.xiongluoluo.bean.CollectionBean;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Created by Administrator on 2020/1/1 0001.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:*.xml")
public class SpringTest {
@Autowired
private CollectionBean collectionBean;
@Test
public void test(){
System.out.println(collectionBean);
}
}
测试结果
第二种注入方式
构造器注入
构造器注入:利用构造函数为对象中的属性注入值,需要在xml配置文件中进行手动的配置.
要求:对象中必须存在有参数的构造函数.xml中手动配置了哪些属性需要注入值,对象中必须存在对应的属性为参数的构造函数.
如何配置:需要为对象中的每个属性配置一个"constructor-arg"标签:<constructor-arg name="" />
多个参数时,可以用name,value,也可以用index
方式一:
<bean id="dog" class="com.xiongluoluo.bean.Dog">
<constructor-arg name="age" value="3"/>
<constructor-arg name="name" value="小狗"/>
</bean>
方式二:
<bean id="dog1" class="com.xiongluoluo.bean.Dog">
<constructor-arg index="0" value="3"/>
<constructor-arg index="1" value="小狗"/>
</bean>