对于Spring中AOP,DI,IoC概念的理解

IOC


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

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

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

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

举例说明下?

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

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

  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. 值得信赖的人安排,只须要守株待兔ui

    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

原文出处:https://www.cnblogs.com/QuixoteY/p/11170263.html

相关文章
相关标签/搜索