IOC控制反转理论推导(为什么要用IOC)

本文通过一个简单的例子展示了传统代码中随着需求增加导致的耦合性问题。当用户需求变更时,需要频繁修改UserService类以适应新的UserDao实现。为了解决这个问题,引入了控制反转(IoC)的概念,通过set注入接口,使得程序不再负责对象的创建,降低了系统间的耦合。程序员不再需要手动管理对象,而是由外部容器控制,实现了被动接受对象,提高了代码的可维护性和灵活性。
摘要由CSDN通过智能技术生成

传统的设计

UserDao接口

    public interface UserDao {
        public void getUser();
    }	

UserDaoImpl实现类

    public class UserDaoImpl implements UserDao{
        @Override
        public void getUser() {
            System.out.println("获取用户数据");
        }
    }

UserService接口

    public interface UserService {
        void getUser();
    }

UserServiceImpl实现类

    public class UserServiceImpl implements UserService{
       private UserDao userDao=new UserDaoImpl();

        @Override
        public void getUser() {
            userDao.getUser();
        }
    }

测试代码

  	@Test
    public void test1(){
        UserServiceImpl userService=new UserServiceImpl();
        userService.getUser();
    }

现在是在UserServiceImpl实现类中new一个UserDaoImpl,再通过调用UserDaoImpl的getUser方法

新增需求:增加一个UserDao的实现类UserMySQLImpl,

UserMySQLImpl实现类:

    public class UserMySQLImpl implements UserDao{
        @Override
        public void getUser() {
            System.out.println("获取用户的MySQL数据");
        }
    }

UserServiceImpl实现类

    public class UserServiceImpl implements UserService{
       private UserDao userDao=new UserDaoImpl();
       private UserDao userDao1=new UserMySQLImpl();
        @Override
        public void getUser() {
            userDao.getUser();
            userDao1.getUser();
       }
    }

UserServiceImpl类中新增了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V77fh1ay-1619192261356)(https://i.loli.net/2021/04/23/3GhfZvFSA7LPXQB.png)]

要是现在再增加一个UserDao的实现类,则需要在UserServiceImpl中new一个UserDao的实现类,以此类推,要是有很多不同的UserDao实现类,则需要不停地往UserServiceImpl中新增new语句,不断修改其中的代码。需求多了以后,每次修改显得非常麻烦。

解决方法:

修改UserServiceImpl类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kT8PIsjW-1619192261358)(https://i.loli.net/2021/04/23/cj1sVLlqhJfuTMg.png)]

用户每次调用只需要new 一个想要调用的类即可,而不是每次都需要程序员去修改UserServiceImpl中的代码

调用UserDaoImpl
在这里插入图片描述
调用UserMySQLImpl
在这里插入图片描述
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们要根据用户的需求去修改代码,如果代码量大,修改一次的成本非常高。

现在我们使用一个set注入接口,已经发生了革命性变化
在这里插入图片描述

  • 之前,程序主动创建对象,控制权在程序员手上

  • 使用set注入接口后,程序不再具有主动性,而是变成了被动的接受对象

    这就叫控制反转

  • 这种思想,从本质上解决了问题,程序员不再用去管理对象的创建,系统耦合性大大降低,这是IOC的原型

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值