为什么需要控制反转?
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!
通过实例来认识一下!
Mapper接口类
public interface Mapper {
public void use();
}
Mapper一个实现类:
public class MySQLMapperImpl implements Mapper {
public void use() {
System.out.println("使用MYSQL。。。");
}
}
MapperService的接口类:
public interface MapperService {
public void use();
}
MapperService的实现类:
public class MapperServiceImpl implements MapperService {
//定义一个dao层的Mapper接口,创建一个接口的实现类
private Mapper mapper =new MySQLMapperImpl();
public void use() {
//调用实现类的方法
mapper.use();
}
}
测试类:
@org.junit.Test
public void test(){
//创建一个MapperServiceImpl实现类
MapperService mapperService = new MapperServiceImpl();
//调用MapperServiceImpl实现类方法
mapperService.use();
}
结果:
当Mapper接口的实现类增加一个
public class OracleMapperImpl implements Mapper {
public void use() {
System.out.println("使用Oracle...");
}
}
紧接着我们要去使用Oracle的话 , 我们就需要去MapperService实现类里面修改对应的实现类
在假设, 我们再增加一个Redis的实现类
public class RedisMapperImpl implements Mapper {
public void use() {
System.out.println("使用Redis。。。");
}
}
如果我们要去使用Redis的话 , 我们就又需要去MapperService实现类里面修改对应的实现类
假设我们的这种需求非常大 , 这种方式就根本不适用了每次变动 , 都需要修改大量代码 . 这种设计的耦合性太高了, 牵一发而动全身
如何解决呢?
我们可以在需要使用到它的地方,不去主动创建对象实现它,而是留出一个接口,提供一个set方法,通过调用不同的程序传入不同的参数去执行不同的方法
MapperServiceImpl类修改
public class MapperServiceImpl implements MapperService {
//定义一个dao层的Mapper接口
private Mapper mapper ;
//为Mapper提供一个接口,方便传值调用
public void setMapper(Mapper mapper) {
this.mapper = mapper;
}
public void use() {
//调用方法
mapper.use();
}
}
测试类:
@org.junit.Test
public void test(){
//创建一个MapperServiceImpl实现类
MapperService mapperService = new MapperServiceImpl();
//通过set方法进行自动的传入一个Mapper接口实现类
((MapperServiceImpl) mapperService).setMapper(new MySQLMapperImpl());
//调用实现类方法
mapperService.use();
}
结果:
如果我们想使用Oracle时
结果:
总结:已经发生了根本性的变化 , 很多地方都不一样了 以前由程序去进行控制创建 , 而现在是由我们自行控制创建对象 , 把主动权交给了调用者 . 程序不用去管怎么创建,怎么实现了. 它只负责提供一个接口 .不再去管理对象的创建了 , 更多的去关注业务的实现 . 耦合性大大降低 . 这也就是IOC的原型
IOC的本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了
IOC的作用:降低程序间的耦合(依赖关系)