依赖注入DI(Dependency Injection),与控制反转IoC含义相同,只不过这两个是从两个角度描述同一个概念:
IoC:使用Spring框架之后,对象的实例由Spring容器创建。也就叫控制翻转。
DI:从Spring容器的角度来看,Spring容器将被依赖对象赋值给调用者的成员变量,相当于为调用者注入了它依赖的实例。这就是Spring的依赖注入。
依赖注入的实现方式:
第一步:创建一个接口
package com.ithema.ioc;
public interface UserService {
//在接口中定义say()方法
public void say();
}
第二步:创建Impl实现类
package com.ithema.ioc;
public class UserServiceImpl implements UserService {
/*
* 如果想调用需要有UserDao这个属性,
* 需要依赖一个UserDao
*/
//第三步:(依赖UserDao)声明UserDao属性
private UserDao userDao;
//get方法,这里没用到
public UserDao getUserDao() {
return userDao;
}
/*
* Alt+Shift+S自动生成get/setter
* 第五步:创建一个UserDao对象 userDao,目前声明的是空的,想要UserDao的方法,需要setter方法实现依赖注入
* 在Spring中,添加UserDao属性的setter方法用于实现依赖注入
*
* 写完之后,进入xml配置文件,配置
*/
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void say() {
// TODO Auto-generated method stub
//第一步:实现这个接口,控制台输出一句话
System.out.println("userService say hello World!");
/*
* 第二步:
* 当前是在继承UserService中的Impl实现类,如果想调用UserDao中的方法,需要依赖一个UserDao属性(声明一个UserDao)
*/
/*
*第四步: 声明过UserDao后,调用UserDao中的say()方法
* 调用UserDao中say()方法,执行输出语句;
*/
this.userDao.say();
}
}
第三步:配置UserService的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-4.3.xsd">
<!-- 进行配置,将指定类配置给spring,让spring创建其对象的实例 -->
<bean id="userDao" class="com.ithema.ioc.UserDaoImpl"></bean>
<!-- class实现类的权限命名 -->
<!--在main里用到,这里用作参考、加深记忆
Spring获取Bean的实例两种方法:
1、Object getBean(String name);
根据容器中Bean的id或name来获取指定的Bean,返回顶层类型,Object(对象)类型,获取后需要强制类型转换
2、<T> T getBean(Class<T> requiredType)
根据类对象的类型来获取Bean的实例。由于时泛型方法,因此不需要强制转换类型
-->
<!-- UserService的配置: 添加一个id为userService的实例 -->
<bean id="userService" class="com.ithema.ioc.UserServiceImpl">
<!-- 将id为userDao的Bean实例 注入到userService实例中 -->
<property name="userDao" ref="userDao"></property>
<!-- 实现依赖注入时 property 的name属性为需要实现依赖注入的属性
ref为注入来源bean的id,这里来源于上一个bean的id
-->
</bean>
</beans>
第四步:配置xml完成后,创建一个TestDI的测试文件
想要使用xml配置文件首先需要加载它
1、加载配置文件
//1.初始化Spring容器,加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
2、创建(加载)Spring容器后,就可以获取Spring容器中的Bean。
Spring获取Bean的实例两种方法:
(1)、Object getBean(String name);
根据容器中Bean的id或name来获取指定的Bean,返回顶层类型,Object(对象)类型,获取后需要强制类型转换
(2)、<T> T getBean(Class<T> requiredType)
根据类对象的类型来获取Bean的实例。由于时泛型方法,因此不需要强制转换类型
//2.通过容器获取UserService实例
UserService userService=(UserService) applicationContext.getBean("userService");
3、调用say()方法
//3.调用实例中的say()方法
userService.say();
整体:
package com.ithema.ioc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDI {
public static void main(String[] args) {
//1.初始化Spring容器,加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.通过容器获取UserService实例
UserService userService=(UserService) applicationContext.getBean("userService");
//3.调用实例中的say()方法
userService.say();
}
}