Spring之IOC(控制反转)原型

为什么需要控制反转?

在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!

通过实例来认识一下!

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的作用:降低程序间的耦合(依赖关系)

猜你喜欢

转载自blog.csdn.net/weixin_45608165/article/details/113797463