二、Spring IoC 思想学习总结
创始人
2025-05-29 21:43:29
0

文章目录

  • 一、IoC思想
  • 二、IoC 理论推导
  • 三、IoC 的本质




一、IoC思想

IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。
该思想提出的背景:以往编写的代码耦合度太高,往往修改一处代码,就需要修改很多处互相关联的代码。在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!




二、IoC 理论推导

以往的业务实现我们通常都是使用的三层架构,“用户层、业务层、dao层”。逻辑通常为用户层调用业务层,业务层调用Dao层获取数据返还给用户层,用户层与Dao层不产生直接关联,都是通过业务层去获取Dao层的数据。
  • Dao层代码

    • UserDao 接口

      public interface UserDao {void getUser();
      }
      
    • UserDaoImpl 实现类

      public class UserDaoImpl implements UserDao{@Overridepublic void getUser() {System.out.println("获取默认用户信息");}
      }
      
  • service层(业务层)代码

    • UserService 接口

      public interface UserService {void getUser();
      }
    • UserServiceImpl 实现类

      public class UserServiceImpl implements UserService{private UserDao userDao = new UserDaoImpl();@Overridepublic void getUser() {userDao.getUser();}
      }
      
  • 用户层代码

    public class MyTest {public static void main(String[] args) {UserService userService = new UserServiceImpl();userService.getUser();}
    }
    
  • 运行结果:在这里插入图片描述

从结果可以看出,用户层获取到了Dao层的数据,没有问题。

       现在的代码业务中,只要一个需求,就是从Dao层中获取默认用户数据。如果用户的需求增加了,需要获取其他用户数据,就需要在Dao层中重新创建新的实现类,并且在业务层的实现类中重新 new 一个Dao层中新创建的实现类的对象,用户层业务不变。
  • Dao层

    • 新增 MySqlUserDaoImpl(新的数据来源)

      
      public class MySqlUserDaoImpl implements UserDao{@Overridepublic void getUser() {System.out.println("通过MySQL获取用户数据");}
      }
      
  • service层(业务层)代码

    • 修改 UserServiceImpl 实现类
      public class UserServiceImpl implements UserService{// private UserDao userDao = new UserDaoImpl();private UserDao userDao = new MySqlUserDaoImpl();@Overridepublic void getUser() {userDao.getUser();}
      }
      
  • 用户层代码不变
    在这里插入图片描述

用户层成功获取到了新的数据来源。

但是每次新增加数据来源都需要去将 service 层的实现类中 new 新的对象,不但程序耦合性极高,如果程序代码量十分庞大的话,还需要耗费大量的时间去修改。

       Java革命性的一步出现了!!在业务层的实现类中新增 set() ,专门用来接收对象,从此我们便不在需要一个一个的去 new 新的对象了,而是将创建对象的主动权交给用户层手中,让用户自己去选择。
  • service层(业务层)代码

    • UserService 接口中新增 set() 方法用来接收用户创建的对象

      public interface UserService {void getUser();void setUser(UserDao userDao);
      }
    • 修改 UserServiceImpl 实现类

      public class UserServiceImpl implements UserService{// private UserDao userDao = new UserDaoImpl();// 将UserDao 设置成变量,而不是创建指定的对象private UserDao userDao;@Overridepublic void getUser() {userDao.getUser();}@Overridepublic void setUser(UserDao userDao) {this.userDao = userDao;}
      }
      
  • 用户层代码

    public class MyTest {public static void main(String[] args) {UserService userService = new UserServiceImpl();//用户需要创建那个对象就创建那个对象,将创建权交给用户userService.setUser(new UserDaoImpl());userService.getUser();}
    }
    
  • 运行结果
    在这里插入图片描述

  • 以往的业务逻辑是程序是主动创建对象!控制权在程序猿手上!

  • 使用了set注入后,程序不再具有主动性,而是变成了被动的接收对象!用户掌握主动权,由用户选择所要调用的业务!

这种思想,从本质上解决了问题,我们不在需要在程序中管理此类对象的创建了,将对象的创建权交给用户。这样做不但可以大大降低程序代码的耦合,还可以使我们更加专注将经理放在业务实现上。这就是 Spring 框架 IoC思想的原型。




三、IoC 的本质

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。也有人认为DI只是IoC的另一种说法。没有IoC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。

       采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

        控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

相关内容

热门资讯

面试错题本 目录2023.3.21 深信服哈夫曼树哈夫曼编码 2023.3.21 深信服 ​同一线程共享的有堆、...
武昌区多措并举护航端午假期,中... 极目新闻通讯员 费帆 葛倚兵 刘朵 栏题 5月31日,端午节首日。为了确保游客出行安全和顺畅,武昌...
畅享南宁至靖西自驾游攻略:路线... 南宁,这座广西的首府,是一个充满活力的城市,四周环绕着壮丽的自然风光。而靖西,作为广西的一颗璀璨明珠...
“龙舟水”期间出游安全提示 当前,广东省已进入“龙舟水”集中降雨期,极端天气频发,暴雨洪涝、山体滑坡、城乡内涝等风险显著增加。江...
现代数据栈MDS应用落地介绍—... Dazdata MDS 现代数据栈MDS的出现使得中小企业低成本获得大数据处理能力成为可能ÿ...
速看!面试高频题! 答案都给你... 互联网中高薪,门槛相对较低的产品经理,正成为越来越多人的职业选择。而“工...
西葫芦虾滑饼:鲜嫩虾滑与清爽西... 准备材料:西葫芦虾滑盐白胡椒粉 具体步骤:西葫芦刨丝:将西葫芦刨成细丝。加盐杀出水分:在西葫芦丝上...
原创 饭... 标题:饭店里最坑爹的三道菜,图一我忍了,图三你要是能吃下去我服你。 在美食的世界里,我们总是对那些...
酱汁浓郁好吃到起飞的家庭版香菇... "这真的是自己做的炸酱?"老公盯着碗里乌黑发亮的炸酱,筷子悬在半空迟迟不敢落下。在北京胡同住了40年...
泊头鸭梨多种吃法 泊头鸭梨凭借其皮薄肉细、汁多脆甜的特点,可衍生出多种特色吃法,结合传统养生智慧与现代创意,形成独特的...
原创 误... 哪怕只有一个人吃饭,也要做到精致得体,美食、不仅仅是为了果腹,更是对生活的一种品味和追求,用心去过好...
原创 夏... 导语:夏天,鸡蛋和它才是绝配,通便排毒,利湿解暑热,软嫩爽口,遇到别再错过了! 大家好,我是傻姐美食...
SpringBoot整合Jav... 目录 一、创建一个spring boot工程 二、导入JavaFX依赖 三、创建fxml文件以及co...
阅读ReentrantLock... AbstractQueuedSynchronizer,缩写AQS,翻译过...
yolov5 网络结构(暂记) Backbone :Focus + BottleneckCSP+SPP Focus ...
【教程】nginx快速学习 【教程】nginx快速学习备注一、基础概念1.nginx概念2.反向代理和负载均衡二、安装和部署1....
C++中类的静态、常量、引用成... 1、类的静态成员变量,必须在类外再声明一次 这是因为类内的声明只是描述了类的成员变量和...
中国人工智能企业CIMCAI世... 中国上海人工智能企业CIMCAI全球港航人工智能领军者,成熟智慧港航产品数字化航运自动...
适合学生党的蓝牙耳机品牌有哪些... 蓝牙耳机越来越成为我们日常生活中不可或缺的存在,不管是听歌、追剧、玩游戏还是外出运动等...
ES-模糊查询 1. 前缀搜索:prefix 概念:以xx开头的搜索,不计...