依赖注入(简称DI)与控制反转(简称IoC)的含义相同。只不过这两种称呼是从两种角度描述的同一概念。对于一个Spring初学者来说,这两种称呼很难理解,下面我们简单的描述一下:
当某个java对象(调用者)需要调用另一个java对象(被调用者,即被依赖对象)时,在传统模式下,调用者通常会使用“new 被调用者”的方式来创建对象,这种方式使调用者与被调用者之间的耦合性增加,不利于后期项目的升级和维护。
在使用Spring框架之后,对象的实例不再由调用者创建而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的代码直接控制。这样就发生了Spring的控制反转。
从Spring容器角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了他依赖的实例,这就是Spring的依赖注入,这就是Spring的依赖注入
下面来是实现一个依赖注入的例子
1、在com.itheima.ioc包中,创建接口UserService,在接口中编写一个say()方法,如下面代码所示
package com.itheima.ioc;
public interface UserService {
public void say();
}
2、在com.itheima.ioc包中创建一个UserService接口的实现类UserServiceImpl,在类中声明userDao属性,并添加属性的setter方法,如下面代码所示:
package com.itheima.ioc;
public class UserServiceImpl implements UserService {
//声明属性
private UserDao userDao;
//添加UserDao属性的setter方法,用于实现依赖注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
//实现接口中的方法
public void say() {
//调用userDao中的say方法,并执行输出语句
this.userDao.say();
System.out.println("userService say hello World !");
}
}
3、在配置文件applicationContext.xml中,创建一个id为userService的Bean,该Bean用于实例化UserServiceImpl类的信息,并将userDao实例注入到userService中,其代码如下所示:
<?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-4.3.xsd">
<bean id="userDao" class="com.itheima.ioc.UserDaoImpl" />
//创建一个bean
<bean id="userService" class="cpm.itheima.ioc.UserServiceImpl">
//将id为userDao的Bean实例注入到userService实例中
<property name="userDao" ref="userDao"/>
</bean>
</beans>
4、在com.itheima.ioc包中,创建测试类TestDI,来对程序进行测试,如下面代码所示:
package com.itheima.ioc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDI {
private static ApplicationContext applicationContext;
public static void main(String[] args) {
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获得userDao实例
UserService userService = (UserService) applicationContext.getBean("userService");
//调用实例中的say()方法
userService.say();
}
}
5、执行程序后,控制台输出结果如图所示
输出信息显示,不仅输出了userService中的say方法,还输出了userDao中的say方法(userDao的创建在上一篇博客Spring程序入门)