美文网首页
Spring的IOC与AOP

Spring的IOC与AOP

作者: ZMRWEGo | 来源:发表于2018-08-23 15:45 被阅读5次
  • Spring容器

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

为什么要使用spring的框架进行开发?这个问题当然要从spring容器的特性开始回答。spring最经典的两个特性即:控制反转(IOC)和面向切面编程(AOP)。它使得传统的程序设计更加灵活,各个模块间的耦合度也更低。

  • IOC

我们可以从三张图中清楚的看到spring容器IOC的作用,在没有容器的情况下,软件系统的各个组件之间的构成是这样的

图1 各个组件之间的耦合度很高,当系统中的一个组件出现问题时,会使得整个系统停止运转,这种齿轮的啮合关系和软件系统中各个组件共同协作运行是一样的。简单的说就是一损俱损。所以才有了IOC(Inversion of Control)理论的提出,即通过第三方的容器实现具有依赖关系的组件之间的解耦,我们也可以称之为依赖注入(DI:Dependency Injection),这种模式就相当于下图所示:
图2
由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。拿掉IOC容器之后的情况: 图3 依赖注入这时也不难理解了吧,在没有容器的时候,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上;软件系统在引入IOC容器之后,这种情形就完全改变了,如图3所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。
通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
  • AOP(Aspect-Oriented Programming)

AOP即面向方面的编程,是面向对象编程(OOP)的一种补充技术。 面向对象将应用程序分解成各个层次的对象,而AOP将程序分解成各个方面或者说关注点 。这使得可以模块化诸如事务管理等这些横切多个对象的关注点。

  • AOP基本概念
  • 方面(Aspect)
    一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的 Advisor或拦截器实现。
  • 连接点(Joinpoint)
    程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
  • 通知(Advice)
    在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架 包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。
  • 切入点(PointCut)
    指定一个通知将被引发的一系列连接点 的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。
  • 引入(Introduction)
    添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。
  • 目标对象(Target Object)
    包含连接点的对象。也被称作被通知或被代理对象。
  • AOP代理(AOP Proxy)
    AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
  • 织入(WeaVing)
    组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样, 在运行时完成织入。

Spring AOP 是Spring 框架的重要组成部分,它实现了AOP联盟约定的接口。Spring AOP 是由纯Java开发完成的。Spring AOP 只实现了方法级别的连接点,在J2EE应用中,AOP拦截到方法级的操作已经足够。OOP倡导的是基于setter/getter 的方法访问,而非直接访问域,而Spring 有足够理由仅仅提供方法级的连接点。为了使控制反转(IoC)很方便的使用到非常健壮、灵活的企业服务,则需要Spring AOP 的实现。Spring AOP 在运行时才创建Advice 对象。Spring AOP的优点如下:

  • 允许开发者使用声明式企业服务,比如事务服务、安全性服务。

  • 开发者可以开发满足业务需求的自定义方面。

  • 开发Spring AOP Advice 很方便,可以借助代理类快速搭建Spring AOP 应用。

相关文章

网友评论

      本文标题:Spring的IOC与AOP

      本文链接:https://www.haomeiwen.com/subject/ivppiftx.html