目录
[4.数组,集合(List,Set,Map),Properties 等的注入](#4.数组,集合(List,Set,Map),Properties 等的注入)
1.IOC和DI的概念
IOC:InverseofControl,控制反转,将对象的创建权反转给Spring。
DI:DependencyInjection,依赖注入,在Spring框架负责创建Bean对象时, 动态的将依赖对象注入到Bean组件中。
2.属性的set方法注入值
编写持久层OrderDao及其实现类:
java
package com.qcby.dao.Impl;
import com.qcby.dao.OrderDao;
public class OrderDaoImpl implements OrderDao {
@Override
public void saveOrder() {
System.out.println("持久层:保存订单........");
}
}
package com.qcby.dao;
public interface OrderDao {
void saveOrder();
}
业务层OrderService及其实现类:
java
package com.qcby.service.Impl;
import com.qcby.dao.OrderDao;
import com.qcby.service.OrderService;
public class OrderServiceImpl implements OrderService {
//提供该属性的set方法,IOC容器底层通过属性的set方法注入值
private OrderDao orderDao;
public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}
//消息
private String msg;
//年龄
private int age;
public void setMsg(String msg) {
this.msg = msg;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void saveOrder() {
System.out.println("业务层:保存订单:"+msg+" - "+age);
orderDao.saveOrder();
}
}
package com.qcby.service;
public interface OrderService {
void saveOrder();
}
测试方法:
java
/**
* 测试DI注入
*/
@Test
public void testDI(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取到了OderService的Bean,这个Bean里面的信息在配置文件里面配置好了
OrderService orderService = (OrderService) context.getBean("os");
orderService.saveOrder();
}
运行:

流程分析:
Spring读取配置文件后,会首先创建OrderDaoImpl,以od为键存入容器
XML
<bean id="od" class="com.qcby.dao.Impl.OrderDaoImpl"/>
然后创建OrderServiceImpl
XML
<bean id="os" class="com.qcby.service.Impl.OrderServiceImpl">
<!--找到OrderDao的setOrderDao方法,把这个bean注入到os里面-->
<property name="orderDao" ref="od"/>
<!--给OrderServiceImpl赋值,也是通过set方法赋值-->
<property name="msg" value="你好"/>
<property name="age" value="19"/>
</bean>
通过无参构造方法创建OrderServiceImpl实例,再通过setOrderDao、setMsg和setAge方法来获取值,也就是依赖注入
测试代码首先读取配置文件(第一行代码),获取到了orderServiceImpl这个Bean(第二行代码),最后调用对象的saveOrder方法。
3.属性的构造方法注入值
新建Car类
java
package com.qcby.eneity;
public class Car {
//名称
private String name;
//金额
private String money;
public Car() {
}
public Car(String name, String money) {
this.name = name;
this.money = money;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", money='" + money + '\'' +
'}';
}
}
在配置文件当中配置:
XML
<!--构造方法注入值-->
<bean id="car" class="com.qcby.eneity.Car">
<constructor-arg name="name" value="福特"/>
<constructor-arg name="money" value="1000000"/>
</bean>
测试方法:
java
/**
* 测试构造方法注入
*/
@Test
public void testConstructor(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car) context.getBean("car");
System.out.println(car);
}
运行:

constructor-arg是构造器参数,用于构造方法注入,name是参数名字,value是参数的值
4.数组,集合(List,Set,Map),Properties 等的注入
新建CollectionBean类
java
package com.qcby.eneity;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class CollectionBean {
//数组
private String[]strs;
public void setStrs(String[]strs){
this.strs=strs;
}
private List<String> list;
public void setList(List<String>list){
this.list=list;
}
private Map<String,String> map;
public void setMap(Map<String,String>map){
this.map=map;
}
private Properties properties;
public void setProperties(Properties properties){
this.properties=properties;
}
@Override
public String toString(){
return"CollectionBean{"+
"strs="+ Arrays.toString(strs)+
",list="+list+
",map="+map+
",properties="+properties+
'}';
}
}
配置Bean
XML
<!--给集合属性注入值-->
<bean id="collectionBean" class="com.qcby.eneity.CollectionBean">
<property name="strs">
<array>
<value>美美</value>
<value>凤凤</value>
</array>
</property>
<property name="list">
<list>
<value>熊大</value>
<value>熊二</value>
</list>
</property>
<property name="map">
<map>
<entry key="aaa" value="老王"/>
<entry key="bbb" value="小王"/>
</map>
</property>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
测试代码
java
/**
* 引用类型的注入
*/
@Test
public void testReferenceType(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
CollectionBean collectionBean = (CollectionBean) context.getBean("collectionBean");
System.out.println(collectionBean);
}
结果:
