IOC


IoC(inversion of Control),控制反转。就好像敏捷开发和SCRUM一样,不是什么技术,而是一种方法论,一种工程化的思想。使用IoC的思想意味着你将设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

为什么要控制反转呢,谁在控制谁呢,反转了什么东西呢?这篇笔记聊的就是这些东西

  • 谁在控制谁? 一般来讲,我们直接new一个对象,是我们运行的这个程序去主动的创建依赖对象;但是IoC时会有一个IoC容器来负责这些对象的创建。这个时候IoC容器控制了对象,控制了外部资源获取。
  • 反转了什么呢?在传统的程序里面,我们在对象中主动控制去直接获取依赖对象,而现在,这个过程反了过来。

依赖(在A类里面创建了B类的实例,这样A依赖于B)

举例说明下?

在Github上面看到了一段很有意思的伪代码,我感觉很能解释IoC的关系,于是就摘抄到这里面来

在生活中,和一个女孩子认识有三种方法

  1. 青梅竹马

    public class Girl{
    void Kiss(){
    Boy RightPerson = new Boy();
    }
    }

    这个RightPerson最大的缺点就是没办法更换(...),在Boy的整个生命周期里面他都会存在,如果Girl想换一个boy kiss呢,就不是很好了(...)

  2. 相亲平台

    public class Girl{
    void Kiss(){
    Boy Boy = BoyFactory.createBoy();
    }
    }

    这个Boy是不是RightPerson就不知道了,但是不满意就换。但是我们现在有了一个Boy Factory,这很烦,有外人/平台介入了日常生活,它以单例模式或者是存在于全局。

  3. 值得信赖的人安排,只需要守株待兔

    public class Girl{
    void kiss(Boy boy){
    boy.kiss();
    }
    }

    你传什么给我,我就和什么Kiss(表达有点不大合适,但是也想不出什么好词了),至少这种方式Girl和Boy不用忙活了。

这就是IoC的基本思想,将对象的创建和提取到外部,由外部容器提供所需要的组件。

为什么要使用IoC呢

说实话,”高内聚,低耦合“这句话我都听到吐了。每个上过软件工程导论课的同学都能跟你侃侃而谈五分钟。那接着往下问”什么是内聚,什么是耦合“”为什么要倡导松耦合的设计,这跟面向对象设计法则又有什么关系呢?“

有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间的耦合是松散的,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

IoC相当于是将应用程序赋予给了一个中心,IoC容器。

DI


都提到IoC了,怎么能少得了DI(Dependency Injection ),注入依赖或者依赖注入?anyway,随便你。组件之间的依赖关系由容器在运行过程中规定。具象化一点,各个组件的依赖关系是由容器来注入的。开发者依赖这个机制,只需要通过配置指定资源,完成业务逻辑即可,不用关心具体的资源来自何方,由谁实现(依然是面向对象的思想)

那么,你说的这个DI和IoC,他们有区别吗?

有区别,但是其实DI和IoC说的是一个东西,因为IoC这个东西说的模模糊糊,Martin Fowler(XP的提出者之一,敏捷方法的创始人)在2004提出了DI的概念,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

Martin Fowler 的原文是这样的,在inversion of Control这一节里面,他提到

As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.

IoC是我们想要做的事情,每个框架都说自己IoC,DI是我们采取的手段

我摘了一段知乎的回答,问题的链接贴在下面,有些回答举了一些具体的例子,很有利于理解

ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。

第一,资源集中管理,实现资源的可配置和易管理。

第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。

AOP(Aspect-Oriented Programming)


我们都知道Spring的AOP是这个框架的重要组成部分 ,那AOP,面向切面编程又是在做什么呢?

在面向对象的思想里面(Object-Oriented Programing)有三大法宝,”封装,继承,多态“,用这三大法宝建立了对象的层次,但是它是一个纵向的结构,有比较明确的上下级关系,但是在平行的层次中发挥不出太大的作用。

所以我们又需要一种横向的结构来定义这些平行的关系,以日志记录为例,记录日志一般要在操作完毕之后,用OOP的思想,那我就要去项目的每个操作数据库的方法的里面去加上保存日志,这会导致代码重复,模块的重用会因此受到影响。

如果使用AOP,只需要自定义一个方法,在spring配置文件中将该方法配置好,当每次调用完原先的save方法时,都会去执行你写的保存日志方法。

它将程序中的交叉业务逻辑(日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。

参考

  1. 《Spring实战》

  2. Spring IoC有什么好处呢 https://www.zhihu.com/question/23277575/answer/134413451 (这里面有一些回答很有参考价值,仔细看看发现自己以前的理解还是有问题)

  3. Inversion of Control Containers and the Dependency Injection pattern https://martinfowler.com/articles/injection.html

  4. ioc https://github.com/biezhi/java-bible/tree/master/ioc

对于Spring中AOP,DI,IoC概念的理解的更多相关文章

  1. Spring中三个重要概念 IOC AOP Bean

    Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...

  2. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)

    一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...

  3. Spring中AOP主要用来做什么。Spring注入bean的方式。什么是IOC,什么是依赖注入

    Spring中主要用到的设计模式有工厂模式和代理模式. IOC:Inversion of Control控制反转,也叫依赖注入,通过 sessionfactory 去注入实例:IOC就是一个生产和管理 ...

  4. Spring专题2: DI,IOC 控制反转和依赖注入

    合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...

  5. Spring中AOP简介与切面编程的使用

    Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...

  6. Spring中AOP相关源码解析

    前言 在Spring中AOP是我们使用的非常频繁的一个特性.通过AOP我们可以补足一些面向对象编程中不足或难以实现的部分. AOP 前置理论 首先在学习源码之前我们需要了解关于AOP的相关概念如切点切 ...

  7. Spring的AOP和IoC及隔离级别

    Spring的AOP和IoC Spring AOP:代理机制.Spring提供的自动代理机制 Spring的IoC来实组件之间的依赖关系注入, 使控制层与业务实现分离,即客户通过调用业务委托接口来调用 ...

  8. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  9. 浅析Spring中AOP的实现原理——动态代理

    一.前言   最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...

随机推荐

  1. 最通俗易懂的方式让你理解 Swift 的函数式编程

    函数式编程(Functional Programming)是相对于我们常用的面向对象和面向过程编程的另外一种开发思维方式,它更加强调以函数为中心.善用函数式编程思路,可以对我们的开发工作有很大的帮助和 ...

  2. Xamarin简介

    简介 简单来说,Xamarin提供了使用C#完成iOS,Android和Windows Phone三个移动平台开发的可能性Xamarin包括Xamarin.Andriod.Xamarin.IOS.Xa ...

  3. OpenGL红宝书附带源码编译问题集锦

    以下所有源码均在win7,VS2008环境下测试.下不再赘述. 1.所有的.c扩展名请改为.cpp扩展名,以避免不可预测的错误. 想知道会出现什么不可预测的错误..请见我上一篇Blog... 2.如果 ...

  4. Delphi Android ActivityManager(提供了接口, 利用它可以方便的对Memory, Processes, Task, Service 等进行管)

    ActivityManager:   对Activity交互提供了接口, 利用它可以方便的对Memory, Processes, Task, Service 等进行管理,. 这里对Delphi接口进行 ...

  5. Win8 Metro(C#)数字图像处理--2.52图像K均值聚类

    原文:Win8 Metro(C#)数字图像处理--2.52图像K均值聚类  [函数名称]   图像KMeans聚类      KMeansCluster(WriteableBitmap src,i ...

  6. Python日记:基于Scrapy的爬虫实现

    安装 pywin32 和python版本一致 地址 https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/安装过程中提示 ...

  7. GitLab一键式安装bitnami 专题

    git lab developer角色不能提交到master分支的问题 错误提示: git -c diff.mnemonicprefix=false -c core.quotepath=false p ...

  8. 毕设(五)ListView

    ListView 控件可使用四种不同视图显示项目.通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本. 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成 ...

  9. UBUNTU 16.04 + CUDA8.0 + CUDNN6.0 + OPENCV3.2 + MKL +CAFFE + tensorflow

    首先说一下自己机子的配置 CPU:Intel(R) Core(TM) i5-5600 CUP @3.20GHz *4 GPU : GTX 1060 OS : 64bit Ubuntu16.04LTS ...

  10. Silverlight消散,WinRT登台

    2011年,Silverlight刚开始有蓬勃发展的起色,不利的传言就开始大量流传.不安的Silverlight开发者们要求微软澄清,但得到的只是沉默.终于随着微软在BUILD上亮相Window 8以 ...