【转】深刻理解Spring的两大特征(IOC和AOP)

原文连接:https://blog.csdn.net/gloomy_114/article/details/68946881html

 

众所周知,Spring的核心特性就是IOC和AOP,IOC(Inversion of Control),即“控制反转”;AOP(Aspect-OrientedProgramming),即“面向切面编程”。参考书《Spring In Action》,下面分享一下我对这两大特性的我的理解。spring

IOC:IOC,另一种说法叫DI(Dependency Injection),即依赖注入。它并非一种技术实现,而是一种设计思想。在任何一个有实际开发意义的程序项目中,咱们会使用不少类来描述它们特有的功能,而且经过类与类之间的相互协做来完成特定的业务逻辑。这个时候,每一个类都须要负责管理与本身有交互的类的引用和依赖,代码将会变的异常难以维护和极度的高耦合。而IOC的出现正是用来解决这个问题,咱们经过IOC将这些相互依赖对象的建立、协调工做交给Spring容器去处理,每一个对象只须要关注其自身的业务逻辑关系就能够了。在这样的角度上来看,得到依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其余对象和文件资料等等)。数据库

举例:某一天,你生病了,可是你不清楚本身到底得了什么病,你只知道本身头疼,咳嗽,全身无力。这个时候你决定去药店买药,药店有不少种药,仅仅是治疗头疼就有好几十种,还有西药中药等区别。
而后你本身看了看说明书,选择了一盒你本身以为最能治疗本身病症的药,付钱吃药,期待能够早点好起来。 可是这个过程,对于一个病人来讲,太辛苦了。头疼,咳嗽,全身无力,还要一个个的看药品说明书,一个个的比较哪一个药比较好,简直是太累了。这个时候,你决定直接去医院看医生。 医生给你作了检查,知道你的病症是什么,有什么缘由引发的;同时医生很是了解有哪些药能治疗你的病痛,而且能根据你的自身状况进行筛选。
只须要短短的十几分钟,你就能拿到对症下药的药品,即省时又省力。

在上面这个例子中,IOC起到的就是医生的做用,它收集你的需求要求,而且对症下药,直接把药开给你。你就是对象,药品就是你所须要的外部资源。经过医生,你不用再去找药品,而是经过医生把药品开给你。这就是整个IOC的精髓所在。编程

AOP面向切面编程,每每被定义为促使软件系统实现关注点的分离的技术。系统是由许多不一样的组件所组成的,每个组件各负责一块特定功能。除了实现自身核心功能以外,这些组件还常常承担着额外的职责。例如日志、事务管理和安全这样的核心服务常常融入到自身具备核心业务逻辑的组件中去。这些系统服务常常被称为横切关注点,由于它们会跨越系统的多个组件。安全

AOP的概念很差像IOC同样实例化举例,如今咱们以一个系统中的具体实现来说讲AOP具体是个什么技术。.net

咱们以系统中经常使用到的事务管控举例子。
在系统操做数据库的过程当中,不可避免地要考虑到事务相关的内容。若是在每个方法中都新建一个事务管理器,那么无疑是对代码严重的耦合和侵入。为了简化咱们的开发过程(实际上spring所作的一切
实现都是为了简化开发过程),须要把事务相关的代码抽成出来作为一个独立的模块。经过AOP,确认每个操做数据库方法为一个链接点,这些链接点组成了一个切面。当程序运行到其中某个一个切点时,
咱们将事务管理模块顺势织入对象中,经过通知功能,完成整个事务管控的实现。这样一来,全部的操做数据库的方法中不须要再单独关心事务管理的内容,只须要关注自身的业务代码的实现便可。全部的事
务管控相关的内容都经过AOP的方式进行了实现。简化了代码的内容,将目标对象复杂的内容进行解耦,分离业务逻辑与横切关注点。

下面介绍一下AOP相关的术语:设计

通知: 通知定义了切面是什么以及什么时候使用的概念。Spring 切面能够应用5种类型的通知:代理

  • 前置通知(Before):在目标方法被调用以前调用通知功能。
  • 后置通知(After):在目标方法完成以后调用通知,此时不会关心方法的输出是什么。
  • 返回通知(After-returning):在目标方法成功执行以后调用通知。
  • 异常通知(After-throwing):在目标方法抛出异常后调用通知。
  • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用以前和调用以后执行自定义的行为。


链接点:是在应用执行过程当中可以插入切面的一个点。日志

切点: 切点定义了切面在何处要织入的一个或者多个链接点。
切面:是通知和切点的结合。通知和切点共同定义了切面的所有内容。
引入:引入容许咱们向现有类添加新方法或属性。
织入:是把切面应用到目标对象,并建立新的代理对象的过程。切面在指定的链接点被织入到目标对象中。htm

在目标对象的生命周期中有多个点能够进行织入:

  • 编译期: 在目标类编译时,切面被织入。这种方式须要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
  • 类加载期:切面在目标加载到JVM时被织入。这种方式须要特殊的类加载器(class loader)它能够在目标类被引入应用以前加强该目标类的字节码。
  • 运行期: 切面在应用运行到某个时刻时被织入。通常状况下,在织入切面时,AOP容器会为目标对象动态地建立一个代理对象。SpringAOP就是以这种方式织入切面的。
相关文章
相关标签/搜索