依赖注入:它与控制反转的含义相同,只不过这两个称呼是从两个角度描述同一个概念。可以这样理解DI的概念:如果一个对象A需要使用另一个对象B才能实现某个功能,这时就说A对象依赖于B对象,而spring容器创建A对象,会自动将A对象需要的B对象注入到A对象中,此过程就是依赖注入。
依赖注入的作用就是使用Spring框架创建对象时,动态地将其所依赖的对象注入到Bean组件中。
依赖注入有三种实现方式:setter注入、构造方法注入、接口注入(Spring容器不支持接口注入)。
1.setter注入(在实际开发中,通常使用):指IoC容器使用setter方法来注入依赖的实例。通过调用无参构造器或无参static工厂方法实例化Bean后,调用该Bean的setter方法,即可实现基于setter的DI。
2.构造方法注入:指IoC容器使用构造方法来注入被依赖的实例。基于构造器的DI通过调用带参数的构造方法来实现,每个参数代表一个依赖。
利用setter注入方法的实例:
UserService.Java
package cn.ioc;
public interface UserService {
public void addUser();
}
UserServiceImpl.java
package cn.ioc;
public class UserServiceImpl implements UserService {
//使用UserDao接口声明一个对象
private UserDao userDao;
//添加UserDao对象的set方法,用于依赖注入
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
//实现userService中的方法
@Override
public void addUser() {
this.userDao.save();
//调用UserDao中的save()方法
System.out.println("spring:hello user Service");
} }
在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">
<!-- 将指定对象配置给spring,让spring创建其实例 -->
<bean id="userDao" class="cn.ioc.UserDaoImpl"></bean>
<!-- 注册vyige名称为userService实例中-->
<bean id="userService" class="cn.ioc.UserServiceImpl">
<!-- 将userDao实例注入到userService实例中 -->
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
TestApp中package cn.ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestApp {
@Test
public void demo1(){
//1.定义配置文件路径(此处代表在类路径中)
String xmlPath = "applicationContext.xml";
//2.初始化spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//3.通过容器获取userDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//4.调用userDao的save()方法
userDao.save();
}
/**
@Test
public void demo2(){
//1.定义配置文件路径(此处代表在类路径中)
String xmlPath = "applicationContext.xml";
//2.初始化spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//3.通过容器获取userDao实例
UserService userService = (UserService) applicationContext.getBean("userService");
//4.调用userDao的save()方法
userService.addUser();
}
**/
}
控制台输出spring: hello user dao
spring: hello user Service