- 首先,既然有“反转”,我们就先理解一下何为“正转”
- 定义一个TeacherDao接口,并且写一个对应的实现类。
TeacherDao.java
public interface TeacherDao {
public void getTeacher();
}
TeacherDaoImpl.java
public class TeacherDaoImpl implements TeacherDao {
public void getTeacher() {
System.out.println("获取了教师信息");
}
}
- 定义一个TeacherService接口,并且写一个对应的实现类。
TeacherService.java
public interface TeacherService {
public void getTeacher();
}
TeacherServiceImpl.java
public class TeacherServiceImpl implements TeacherService{
private TeacherDao teacherDao = new TeacherDaoImpl();
public void getTeacher() {
teacherDao.getTeacher();
}
}
- 测试
public class test {
public static void main(String[] args) {
TeacherServiceImpl tsi = new TeacherServiceImpl();
tsi.getTeacher();
}
}
结果:
我们直接看
TeacherServiceImpl.java
这种需要在代码里new出对象的方法,由类本身管理对象的方式,我们称之为控制正转
这种写法一般来说没有问题,但是,一旦需要在Dao层中增加了实现方法,
如下:
如果需要使用,我们就需要在Service层中增加对应的实现类代码,代码间的耦合性高。
- 既然知道了什么是正转,那我们来看看什么是控制反转
我们对TeacherServiceImpl.java进行修改
public class TeacherServiceImpl implements TeacherService{
private TeacherDao teacherDao;
//set方法注入需要对象
public void setTeacherDao(TeacherDao teacherDao) {
this.teacherDao = teacherDao;
}
//调用注入对象里的方法
public void getTeacher() {
teacherDao.getTeacher();
}
}
可见,修改为了不需要直接在代码里new出对象,而是直接使用外部注入的对象,需要使用什么对象里的方法就采用set注入即可,这样就使得耦合度降低了。
这种由第三方注入需要对象的方法,不再由本身进行对象管理,则称之为控制反转。
测试方法:
public class test {
public static void main(String[] args) {
// //正传获取
// TeacherServiceImpl tsi = new TeacherServiceImpl();
// tsi.getTeacher();
//反转通过注入对象获取
TeacherServiceImpl tsi2 = new TeacherServiceImpl();
//set方法注入对象
tsi2.setTeacherDao(new TeacherDaoOtherImpl());
tsi2.getTeacher();
TeacherServiceImpl tsi3 = new TeacherServiceImpl();
//set方法注入对象
tsi3.setTeacherDao(new TeacherDaoImpl());
tsi3.getTeacher();
}
}
结果:
在Spring中,我们的对象是可以配置在xml文件(也可以通过注解)的,然后由Spring去生产出我们需要的对象
我们把对象交给了Spring(也就是上方实例中所说的第三方)进行统一管理,就是所谓的控制反转(IOC)。实现方式就是类似上方test中进行对象的注入,也就依赖注入(DI)。
如有错误纰漏,希望批评指出