一、DI:依赖注入
1、创建两个接口和实现类
//一个Service接口
package cn.tx.service;
public interface OrderService {
public void saveOrder();
}
//一个Dao接口
package cn.tx.dao;
public interface OrderDao {
public void saveOrder();
}
//实现类1
import cn.tx.dao.OrderDao;
public class OrderServiceImpl implements OrderService{
//编写成员属性
//一定要提供该属性的set方法,IOC容器通过属性的set方法方式 注入值
private OrderDao orderDao;
public void saveOrder() {
System.out.println("业务层:保存订单!!");
orderDao.saveOrder();
}
public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}
}
//实现类2
package cn.tx.dao;
public class OrderDaoImpl implements OrderDao{
public void saveOrder() {
System.out.println("持久层:保存订单!!");
}
}
2、创建好接口和实现类,现在配置 applicationContext
applicationContext的配置
property: set方式的依赖注入 使用的标签是property
name为属性名
ref:如果是对象类型 使用ref=“其他需要依赖的bean的id” 来赋值
value: IOC容器的赋值:如果是简单类型(8个基本+String) 使用value赋值
<bean id="os" class="cn.tx.service.OrderServiceImpl">
<property name="orderDao" ref="od" />
</bean>
<bean id="od" class="cn.tx.dao.OrderDaoImpl"/>
3、测试类
@Test
public void run1(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
OrderService os= (OrderService) ac.getBean("os");
os.saveOrder();
}
运行结果:
二、属性的构造方法的方式注入
1、创建一个构造方法Car
package cn.tx.demo2;
public class Car {
//名称
private String cname;
//价钱
private Double money;
public Car(String cname, Double money) {
this.cname = cname;
this.money = money;
}
@Override
public String toString() {
return "Car{" +
"cname='" + cname + '\'' +
", money=" + money +
'}';
}
}
2、配置applicationContext
通过<constructor-arg>来进行注入 如果<constructor-arg>的顺序与构造方法的顺序不一致,则需要通过type或者index或name来指定
<!--属性的构造方法的方式-->
<bean id="car" class="cn.tx.demo2.Car">
<constructor-arg name="cname" value="宝马"/>
<constructor-arg name="money" value="800000"/>
</bean>
3、测试类
@Test
public void run2(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Car car= (Car) ac.getBean("car");
System.out.println(car);
}
运行结果:
三、依赖注入之集合属性注入
1、创建一个类
package cn.tx.demo3;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class CollectionBean {
//数组
private String[] strs;
//list集合
private List<String> list;
//map集合
private Map<String,String> map;
//properties
private Properties properties;
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setList(List<String> list) {
this.list = list;
}
public void setStrs(String[] strs) {
this.strs = strs;
}
@Override
public String toString() {
return "CollectionBean{" +
"strs=" + Arrays.toString(strs) +
", list=" + list +
", map=" + map +
", properties=" + properties +
'}';
}
}
2、配置applicationContext
<!--给集合属性注入值-->
<bean id="collectionBean" class="cn.tx.demo3.CollectionBean">
<property name="strs">
<array>
<value>fu</value>
<value>jiashi</value>
</array>
</property>
<property name="list">
<list>
<value>aa</value>
<value>bb</value>
</list>
</property>
<property name="map">
<map>
<entry key="ccc" value="老王"/>
<entry key="ddd" value="小美"/>
</map>
</property>
<property name="properties">
<props>
<prop key="usename">fujiashi</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
3、测试类
@Test
public void run3(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
CollectionBean bean= (CollectionBean) ac.getBean("collectionBean");
System.out.println(bean);
}
4、测试结果: