依赖注入(简称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、执行程序后,控制台输出结果如图所示

java依赖网站地址 javaee依赖注入_spring

输出信息显示,不仅输出了userService中的say方法,还输出了userDao中的say方法(userDao的创建在上一篇博客Spring程序入门)