在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高(假如程序耦合性过高,改一处代码通常要对其他地方也要做大量修改,难以维护)。控制反转(Inversion of Control或IoC)就是常用的面向对象编程的设计原则,使用这个原则我们可以降低耦合性。其中依赖注入是控制反转最常用的实现。

举个例子:

假如现在有三个Dao实现类A, B, C,分别对应不同的操作,通常我们在业务层对其进行实例化,然后对外提供实例化后的方法。如下所示:

1 public class UserSeviceImpl implentments UserService{
2 private UserDao userDao = new A(); //注意这里写死在代码里了,只要调用getUser,返回的就是A的getUser方法
3   
4 public void getUser(){
5 userDao.getUser();
6 }
7 }

可以看到这时候实例化的是A类,是写死在代码里的,而如果后面我想再调用B类中的操作可怎么办呢? 没错,这种情况下就需要对业务层上面这段代码进行改动了。假如,有成千上万个Dao实现类,需求每换一次就要修改一次代码,可想而知有多痛苦。

于是就有了IOC控制反转(这里的控制,本人的理解是对对象创建的控制权)的思想,上面的代码是程序主动创建对象,控制权在程序猿手上;而控制反转后的代码应该变成程序被动接受对象,控制权在用户手上,就像下面这样。好好体会一下控制反转后的代码:

1 public class UserSeviceImpl implentments UserService{
2 private UserDao userDao; //注意这里不再进行实例化了,而是通过提供一个set方法来完成这个工作。

3    public void setUserDao(UserDao userDao){ //利用set动态的进行对象的注入
4     this.userDao = userDao;
5    }

6 public void getUser(){
7 userDao.getUser();
8 }
9 }

于是使用这种方式我们在需求变化后不用再修改业务层的代码,用户直接给setUserDao传入不同Dao实现类的对象就好,使得系统的耦合性大大降低,程序猿也就可以更加专注在业务的实现上,而不用去管理对象的创建问题啦!这是IOC的原型,也是简单的入门理解。

应用到spring上,所谓的 IoC,一句话搞定:就是对象由spring来创建,管理,装配。 后续更难的再慢慢学吧~

最新文章

  1. ASP.NET Core中的依赖注入(1):控制反转(IoC)
  2. CentOS 6.7 如何启用中文输入法
  3. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
  4. shell之数值运算
  5. 『随笔』C# 程序 修改 ConfigurationManager 后,不重启 刷新配置
  6. C里面的类型字节长度和范围
  7. SimpleUrlHandlerMapping 使用
  8. B树叶子节点split
  9. Cookies与保持登录(新浪微博的简单模拟登录)
  10. 说说Android应用的persistent属性
  11. jmeter接口测试实践
  12. Junit4学习(一)新建Junit4工程
  13. Class StatusesTableSeeder does not exist 如何解决
  14. Windows同时安装Python2、Python3兼容运行
  15. 01-Python的介绍_Python编程之路
  16. golang项目中使用条件编译
  17. 返回 字符串的 form和js组合让页面跳转
  18. array_merge() 用法
  19. 12.C# 接口和抽象类的区别
  20. const和volatile分析

热门文章

  1. uni-app学习笔记之----目录认识
  2. U盘启动安装 Centos 出错记录(Reached target Basic System)
  3. Android GNSS模块详解
  4. 国产DP4344兼容替代CSM4344 192K双通道输出数模转换芯片
  5. 【36oj】 画圣诞树
  6. qt 运行环境配置
  7. 前后端分离--token过期策略方案1
  8. 基于recorder.js H5录音功能
  9. 【Python】变量&数据类型&运算符
  10. 03 Proxmox VE介绍