首页 > 其他分享 >如何理解Spring框架中的ioc?

如何理解Spring框架中的ioc?

时间:2023-02-13 17:45:53浏览次数:57  
标签:框架 DI 对象 Spring 理解 内聚 耦合 ioc

目录

如何理解Spring框架中的ioc?

ioc,Inversion of Control(控制反转),是Spring中的一种设计思想而非技术。

我们可以从4个方面理解ioc:

谁控制谁? ——Ioc容器控制对象。

控制了什么? ——Ioc容器控制了获取对象及其外部资源。

为什么是反转? ——传统的javaSE技术是手动new对象的,通过new的对象直接控制资源的(相当于“正转”);而spring是使用Ioc容器创建对象并获取外部资源,相当于通过第三方查询获取(相当于“反转”)。即:传统技术是主动创建对象,而ioc思想是被动接受依赖对象。

怎么实现反转的?——通过依赖注入(DI)的方式实现反转(这里的反转即:获取对象的方式)。

DI

DI,Dependency Injection(依赖注入),是将容器动态地注解到应用程序中。

简单地说,DI是通过注解的方式获取到对象以及一些外部资源。

DI和ioc其实是一个东西,只是理解的层面不同。通俗地说,ioc层面理解就是:获取对象的方式不再是我们主动创建寻找,而是多了个‘中介’去帮我们查询对象并寻找。DI层面理解就是:写代码的时候,要用到某个对象及资源,我们不再需要去查询那个对象在哪里,并且new对象,我们只需要配置好就可以直接通过@获取我们需要的资源。

耦合和内聚

值得一提的是,ioc思想由于通过第三方ioc容器创建对象,能够减少代码的耦合性,从而使得代码更优。

看到这里也许有些人开始蒙了,为啥低耦合代码更优?这样一句话你或许听过:“我们写代码都要尽量向低耦合高内聚靠近!”这说明,低耦合高内聚的代码更好,你只需要知道这一点就够了。至于它们的理解,请继续往下看:

耦合和内聚都是评判软件程序优劣的一个标准。

理解耦合

耦合指的是元素与元素之间的连接关系、依赖程度等。

举个例子,在类1引用类2的变量,我们需要new 类2的对象,这个时候类1和类2产生了一种依赖性:假如类2发生了改变或者消失,类1就会出现问题(报错)。类1与类2的这种关系,就是一种耦合,因为它们之间有一种依赖性。

上述只有两个类作比较,看不出什么,但是如果很多个类之间相互引用(也就是“高耦合”),创建其他类的对象,如果其中一些类做了修改或其他什么,想象一下,会报多少错?查询起来会多麻烦?工作效率是不是大打折扣了?

所以,低耦合的代码会更优。

有的人可能会问,那为什么ioc思想相对传统JavaSE技术就是低耦合的?

ioc思想是通过Ioc容器创建对象,相当于通过第三方查询对象并获取外部资源,是没有直接建立联系的,因此也就不存在高耦合的问题,注解之后资源就自动引入了。

理解内聚

内聚通常指的是功能内聚,即程序之间的共同性。

用一句俗语解释:术业有专攻。各行各业,只需要管属于他们行业范围内的事情就可以了。内聚也是这个意思。

举个例子,我要写一个心理测试系统,那么主要功能就是心理测试。我写的所有代码如果都是心理测试核心代码,那么就是100%内聚,也就是超高内聚了,当然只是举个例子便于理解哈。

高内聚就是要我们写的代码尽可能相关,也就是所有程序尽可能围绕某个具体的功能点,这样程序更具体,也更便于管理。

上述是参考其他文献自行总结的,若有不合理的地方,恳请斧正,谢谢!

参考文献:

《Spring框架的IOC是什么》

【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3

简单理解高内聚低耦合-高内聚低耦合通俗理解是什么?

标签:框架,DI,对象,Spring,理解,内聚,耦合,ioc
From: https://www.cnblogs.com/surplus-G/p/17117178.html

相关文章

  • Odoo丨Odoo框架源码研读一:前后端交互
    Odoo框架源码研读之前后端交互Odoo框架源码的内容——“前后端交互”。源码文件结构\Odoo14.0源码结构:.|--CONTRIBUTING.md|--COPYRIGHT|--LICENSE|--MANIFEST.in|--RE......
  • Spring容器执行bean依赖解析
    源自:https://docs.spring.io/spring-framework/docs/5.2.12.RELEASE/spring-framework-reference/core.html#beans-setter-injectionDependenciesInjectionSpring容器......
  • springboot开发日记(12)——请求映射原理
    请求映射原理由于springboot底层使用的是springMVC,所以研究请求映射原理我们需要从DispatcherServlet入手,搜索DispatcherServlet这个包,我们可以发现他是一个继承类,打开继......
  • Spring Boot 参数校验
    JSR-303JSR-303是JavaEE6中的一项子规范,叫做BeanValidation,为JavaBean验证定义了相应的元数据模型和API,通过使用xml可以对原有的元数据信息进行覆盖和扩展,在应用......
  • springboot网站部署方式
    1centos安装java官网下载java8jdk:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html选择x64CompressedArchive(1)mkdir/usr/local/ja......
  • springboot 读取配置 application.yml
    添加配配置信息spring:application:name:dataExChangePlatformdevtools:restart:enabled:trueadditional-paths:src/main/javae......
  • 微信小程序+SpringBoot实现文件上传与下载
    微信小程序+SpringBoot实现文件上传与下载​​1、文件上传​​​​1.1后端部分​​​​1.1.1引入ApacheCommonsFIleUpload组件依赖​​​​1.1.2设置上传文件大小限制......
  • spring 依赖注入DI(三)
    概念依赖注入(DependencyInjection,DI)。依赖:指Bean对象的创建依赖于容器.Bean对象的依赖资源.注入:指Bean对象所依赖的资源,由容器来设置和装配.Set注入(......
  • 【Spring IOC】Spring IOC 容器源码解析文章导读
    1 前言Spring老生常谈,JavaWeb程序员的必备,程序员不看源码不懂源码,路走不长,所以耐心看,边看操作。本文是SpringIOC源码分析系列文章的导读文章,将会着重介绍Spring的......
  • 面试难题:Spring AOP循环依赖,如何解决?
    面试难题:SpringAOP循环依赖,如何解决?问:Spring如何解决循环依赖?答:Spring通过提前曝光机制,利用三级缓存解决循环依赖(这原理还是挺简单的,参考:三级缓存、图解循环依赖原......