2.IOC 控制反转

2.IOC 控制反转

​ 这是一个过程,在此过程中,对象仅通过构造函数参数,工厂方法的参数或在构造从工厂方法返回后在对象实例上设置的属性来定义其依赖项(即,与它们一起使用的其他对象) 。然后,容器在创建bean时注入那些依赖项。从本质上讲,此过程是通过使用类的直接构造或诸如服务定位器模式之类的机制来控制其依赖关系的实例化或位置的Bean本身的逆过程(因此,其名称为Control Inversion)。

引入的原因

在之前的开发当中 , 用户的需求可能会需要修改原来的代码 , 如下例

  1. dao层

    1. BaseDao接口

      public interface BaseDao {
          void work();
      }
      
    2. BaseDaoMysqlImple 实现类

      public class BaseDaoMysqlImple implements BaseDao {
      
          @Override
          public void work() {
              System.out.println("使用Mysql实现");
          }
      }
      
    3. BaseDaoOracleImple 实现类

      public class BaseDaoOracleImple implements BaseDao {
          @Override
          public void work() {
              System.out.println("使用Oracle实现");
          }
      }
      
  2. service层

    1. BaseService接口

      public interface BaseService {
          void serviceWork();
      }
      
    2. BaseServiceImpl实现类

      public class BaseServiceImpl implements BaseService {
          private BaseDao baseDao;
          @Override
          public void serviceWork() {
              baseDao = new BaseDaoMysqlImple();
              baseDao.work();
          }
      }
      
  3. 测试

    public class BaseTest {
        @Test
        public void test() {
            BaseService baseService = new BaseServiceImpl();
            baseService.serviceWork();  //在这个例子中,结果是 "使用Mysql实现"
            //如果我们想使用Oracle实现 ,会发现在这个层面无法进行操作,需要修改BaseServiceImpl的实现
        }
    }
    

    显然在以上的例子中,如果用户有不同的实现需求 , 我们会不断地更改已经写好的代码,这显然对软件开发来说是糟糕的,那么如何解决这种问题呢?

    在ServiceImpl中添加一个用户可以自主控制的方法

    public class BaseServiceImpl implements BaseService {
        private BaseDao baseDao;
        public void setBaseDao(BaseDao baseDao) {
            this.baseDao = baseDao ;
        }
        @Override
        public void serviceWork() {
            if(this.baseDao != null) {
                this.baseDao.work();
            } else {
                System.out.println("您未指定实现方式");
            }
        }
    }
    
    public class BaseTest {
        @Test
        public void test() {
            //我们发现因为加入了setBaseDao方法 , 可以在 test()中直接进行实现方式的修改
            BaseServiceImpl service = new BaseServiceImpl();
            service.setBaseDao(new BaseDaoOracleImple());
            service.serviceWork();
        }
    }
    

之前 ,程序是主动创建对象 ,控制权在开发者手上(开发者需要手动修改)

现在 ,程序变为了被动接受对象主动权在用户受伤。只需要获取对应参数即可 (开发者只需要写一次代码,之后自动修改实现方式即可)

开发者不用再去管理对象的创建 , 系统的耦合性大大降低 , 开发者只需要**用心实现业务即可 **,即IOC原型

在这里插入图片描述
普通面向对象开发

在这里插入图片描述
IOC开发

IOC的本质

控制反转(IOC Inversion of Control)是一种设计思想(DI)依赖注入 是实现IOC的一种方法

在这里插入图片描述

IOC是Spring的核心内容 , 可以使用XML配置 、注解配置等多种方式实现IOC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值