Spring之AOP

来源:互联网 发布:阿里云管理终端怎么用 编辑:程序博客网 时间:2024/06/18 11:58
一、什么是AOP
    ·aop的基本概念
    面向切面的编程,是一种比较新颖的设计思想,也是Spring框架中一个非常重要的功能,AOP将应用系统分为两个部分,核心业务逻辑以及横向通用逻辑,也就是所谓的方面,例如所有大中型用,都要涉及到的持久化管理,事务管理,安全管理,日志管理已经调试管理等等,在spring当中,提供了面向切面编程的方法支持,允许通过分离应用业务逻辑与系统级的服务进行内聚性的开发,应用对象只是先他们应该做的,也就是完成业务逻辑,仅此而已,他们并不负责,甚至意识到其他系统级别的关注点,例如日志和事务支持等等。

   ·AOP与OOP 的关系
    在软件行业当中,AOP是对OOP面向对象编程的一种有力的补充,同时AOP也是OOP的延续,是软件开发中一个热点,也是spring框架中一个非常重要的内容。我们可以这么理解,面向对象编程OOP是从静态角度考虑程序接口,其对业务处理过程中的实体以及属性和行为进行了抽象的封装, 也获得更加清晰的逻辑划分,研究的是一种静态的领域,而面向切面编程AOP,是从动态角度考虑程序运行过程,其是针对业务过程处理中的切面进行提取,它所面对的是处理过程中某个步骤或者阶段,研究的是一种动态的领域。

      ·AOP的主要功能
    他主要用于系统级别的功能,例如日志记录,性能统计,安全控制,事务处理,异常处理等等。这些主要功能,

       ·AOP的主要意图
主要意图,它主要是将日志接入、性能统计、安全控制、事务处理、异常处理等代码,从业务逻辑代码中划分出来,通过对这些行为的分离我们希望可以将他们独立到非指导性业务逻辑方法当中,继而改变这些行为的时候,不影响业务逻辑代码的处理。也就是说AOP把一些常用的服务进行模块化,并且用声明的方式,将这些组件使用到其他业务组件中去,这样做的结果是,每一个业务组件只要关心自己的业务逻辑,而不用一些常用的服务组件,这样就保证了更高的内聚性。

    使用AOP ,你可以将处理切面代码注入程序,通常注入程序的主要目的,并不在与处理这些切面的功能,所以AOP可以有效的防止代码混乱,Spring的AOP技术是很有前途的技术,作为一种非侵入性,轻量级的AOPframework ,你无需使用预编译器 便可以在java程序中使用它。



二、AOP的存在价值
    AOP专门用于处理系统中分布于各个模块中的交叉关注点的问题,在JAVA EE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理,安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。
    我们为什么要用到AOP呢,是因为由于系统会有很多不同的组件,每一个组件负责一块特定的功能,然而我们需要每一个组件只关心它自己核心功能,但是在系统中,会有一些组件,比如日志模块,事务管理模块和安全模块,全比较频繁的融入到其他核心业务中去,这些常用的组件会分散到其他多个组件当中,这样会带来的麻烦是,如果这些常用的服务组件经常发生变化,那么我们需要在多个其他组件当中进行修改,第二这样使得我们的组件代码,因为插入了与自己核心业务无关的服务组件,而变得很混乱。


如图一所示,
    现在假如系统中有三段完全相似的代码,这些代码通常会用复制黏贴的方式来完成,通过这种复制黏贴的方式所开发出来的软件,就像图一所描述的一样。这种做法的不足之处,如果一天,图一中深色的代码需要修改,那是不是要打开三个地方都要进行修改,如果不是三个地方而是100个 1000个地方,那将会是什么样的后果。为了解决这个问题,我们通常会将如图一所示,将深色部分代码提取成一个方法,然后在三个地方分别引用。在这种方式下,软件系统的结构如图二所示


    对于如图二所示的软件系统,如果需要修改深色部分的代码,只要修改一个地方就可以了,通过这种方式就大大的降低了软件后期维护的复杂度,对于图二所示的三个方法当中,当前需要显视调用,这种适用于大多数的情况,但在一些特殊的情况,应用需要三个方法彻底与深色方法分离,那么我们应该如何解决呢?
因为软件需求变更是很频繁的事情,系统前期设计的3个方法,只实现了核心业务的功能,过了一段时间。我们需要对三个方法进行事务控制,又或者三个方法进行安全验证,只有合法的请求才能使用3个方法。面对这些,我们应该怎么办。通常两种做法,第一,根据需求说明书,直接拒绝,那么第二拥抱需求,满足客户的需求。第一种做法显然不好,客户是上帝,我们应该尽量满足客户的需求,通常是采用第二种做法,那么如何解决能,是不是每次都定义一个新的方法,然后修改以上三个方法,增加新调用的方法呢。这样的工作量也太大了。我们希望有一种的方法,我们只要定义中方法,无需在三个方法中显示的调用,系统就会使用该方法,上面的方法听起来很神奇,甚至有些不切实际,其实是完全可以实现的。实现这个需求的技术就是aop,aop用户处理系统中分部各个模块中,而且是分布于不同方法中的交叉关注点的问题、在j2EE 方法中,通常通过aop处理一具有横切性质的系统级服务,如事务管理、缓存、对象池。


三、AOP的原理剖析
    AOP代理其实是由aop框架动态生成的一个对象,改对象可以作为目标对象使用,AOP代理所包含的方法与目标对象的方法如下图所示:


    AOP实际使用目标类的代理来实现的,AOP代理其实是由AOP框架动态生成的一个对象,改对象可以做目标对象使用,AOP代理包含了目标对象的全部方法,在AOP中方法与目标对象方法存在差异,AOP方法在特定的切入点添加了增强处理,并回调了目标对象方法,那么AOP编程,其中需要程序参与只有三个部分,
第一个部分
    定义普通业务组件
第二个部分
    定义切入点,一个切入点可以会横切多个业务组件
第三部分
    定义增加处理,增加处理就是在AOP框架为普通业务组件织入的处理动作

    上面的三个部分第一个部分是最平常不过的实现。无需额外说明,那么进行aop编程的关键就是定义切入点和定义增加处理,一旦定义了合适的切入点和增强处理。AOP框架将会自动生成AOP代理。而AOP代理的方法,大致有几种模式

    代理对象的方法=增加处理+被代理对象的方法
在上面的业务中发现,spring的AOP的实现原理,实现的很简单,AOP框架负责生成AOP代理,这个代理方法有增加和回调目标对象的方法组成


四、AOP的关键概念

以下是官方文档所给出的AOP的关键概念的解释

切面 - Aspect
    什么是切面,切面是一个关注点的模块化,这有关注点可能会对接多个对象,树管理是J2EE应用中一个关于横切关注点的很好的例子。在spring aop当中,切面可以是基于模式,或者基于注解方式实现,通俗点说,就相当于我们java的日志类

连接点 - join point
    连接点就是程序执行过程当中某个特点的点,比如我方法调用的时候,或是处理异常的时候,在spring的aop过程当中,一个连接点总是表示一个方法在执行,通俗的说就是加入切点一个点

通知 advie
    什么是通知,通知是在切面的某个特点的连接点上执行的动作,其中包括了 before ,after returning advice,after throwsing advice,around advice。许多AOP的框架都是以拦截器做通知模型,并且维护一个以连接点为中心拦截器链。

切入点 - point cut
是匹配连接点的断言,通知和一个切入点表达式并联,并在满足这个切入点的连接点上运行,切入点表达式,如何和连接点匹配,是spring AOP的核心

引入 - introduction
    引入是用来给一个类型声明额外的方法和属性,spring允许引入新的接口到任何被代理的对象,例如可以使用引入来实现 isModify接口,以便简化缓存机制。

目标对象 -target object
    目标对象就是被一个或者多个切面所通知的对象,也被称作被通知对象,既然AOP运行时代理实现,那么这个对象永运被代理的对象

AOP代理  - aop proxy
    aop框架创建对象,用来实现切面契约,在spring当中,AOP代理可以是jdk动态代理。也可以是CGLIB代理。

织入 -  weaving
    织入就是把切面连接到其他的应用程序类型或其他对象之上,并创建一个被通知的对象,这些可以在编译的时候,类加载的时候,或运行的时候来完成,spring 和 其他的 使用 java aop 框架一样,在运行时候完成织入。

五、总结
我们所认识的AOP ,AOP的通俗理解
    一个组件A,不关心其他常用的服务组件B,但是这个组件A使用组件B的时候用,不是组件A自身去调用,而是通过配置等其他方式,比如spring中可以通过XML配置文件。这样就是的A压根就不需要知道服务组件B是怎样的,爱存在不存在,爱怎么存在就怎么存在,这些都与A无关,A 关系自己的业务逻辑,具体A使用B的时候,配置文件去做,与具体A组件无关。
0 0
原创粉丝点击