AOP思想

转载 2016年05月31日 11:41:19

AOPAspect-Oriented Programming的缩写,中文意思是面向切面(或方面)编程。AOP实际上是一种编程思想,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种思想。

在传统的面向对象(Object-Oriented Progr ammingOOP)编程中,我们总是按照某种特定的执行顺序来实现业务流程,各个执行步骤之间是相互衔接、相互耦合的,对垂直切面关注度很高,横切面关注却很少,也很难关注。那么怎样可以解决这个问题呢?我们需要AOP,关注系统的切面,在适当的时候拦截程序的执行流程,把程序的预处理和后处理交给某个拦截器来完成。这样,业务流程就完全的从其它无关的代码中解放出来,各模块之间的分工更加明确,程序维护也变得容易多了。

正如上所说,AOP不是一种技术,而是编程思想。凡是符合AOP思想的技术,都可以看成是AOP的实现。目前的AOP实现有AspectJJBoss4.0nanningspring等项目。其中SpringAOP进行了很好的实现,同时Spring AOP也是Spring的两大核心一。

AOP的发展目前已经历了两个阶段:第一阶--静态AOP和第二阶段动态AOP。静态AOP阶段,相应的横切关注点以Aspect形式实现之后,会通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中。比如AspectJ会使用ajc编译器将各个AspectJava字节码的形式编译到系统的各个功能模块中,已达到融合AspectClass的目的。动态AOP阶段,AOP的织入过程在系统运行开始之后进行,而不是预先编译到系统中,可以在调整织入点以及织入逻辑单元的同时,不必变更系统其他的模块,甚至在系统运行的时候,也可以动态更改织入逻辑。这两个阶段也为我们提供了通过预编译方式和运行期动态代理方式,实现了在不修改源代码的情况下给程序统一添加功能的目的。

AOP主要的意图是:允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。应用对象只实现业务逻辑即可,并不负责其它的系统级关注点。

AOP主要应用场景是:日志记录、跟踪、监控和优化,性能统计、优化,安全、权限控制,应用系统的异常捕捉及处理,事务处理,缓存,持久化,懒加载(Lazy loading),内容传递,调试,资源池,同步等等。

AOP的相关概念

Joinpoint:在系统运行之前,AOP的功能模块都需要织入到OOP的功能模块中。所以,要进行这种织入过程,我们需要知道在系统的那些执行点上进行织入操作。这些将要在其上进行织入操作的系统执行点就称之为Joinpoint。(在Spring AOP 中仅支持方法级别的Joinpoint

Pointcut:代表的是Joinpoint的表达方式。将横切逻辑织入当前系统的过程中,需要参照Pointcut规定的Joinpoint信息,才可以知道应该往系统的哪些Joinpoint上织入横切逻辑。

Pointcut指定系统中符合条件的一组Joinpoint

Advice是单一横切关注点逻辑的载体,代表将会织入到Joinpoint处的横切逻辑。如果将Aspect比作OOP中的Class,那么Advice就相当于Class中的Method。按照AdviceJoinpoint处执行时机的差异或者完成功能的不同,Advice可分成以下具体形式:Before Advice,After Advice(Afterreturning AdviceAfterThrowing AdviceAfterFinally Advice),Around Advice,Introduction

Aspect是对体统中的横切关注点逻辑进行模块化封装的AOP概念实体。Aspect可以包含多个Pointcut以及相应的Advice定义。

织入:完成横切关注点逻辑(以Aspect模块化的横切关注点)到OOP系统的过程。

SpringAOP的实现机制:

Spring AOP采用动态代理机制和字节码生成技术实现。与第一代AspectJ采用编译器将横切逻辑织入目标对象不同,动态代理机制和字节码生成都是在运行期间为目标对象生成一个代理对象,而将横切逻辑织入到这个代理对象中,系统最终使用的是织入了横切逻辑的代理对象,而不是真正的目标对象。

默认情况下,如果Spring AOP发现目标对象实现了相应Interface,则采用动态代理机制为其生成代理对象实例。而如果目标对象没有实现任何InterfaceSpring AOP会尝试使用CGLIB(Code Generation Library)这种动态字节码生成类库,为目标对象生成动态的代理对象实例。

SpringAOP中需注意的相应概念实体:

<!--[if !supportLists]--> 1.Around Advice

Spring中没有直接定义对应Around Advice的实现接口,而是直接采用AOP Alliance

的标准接口,即org.aopalliance.intercept.MethodInterceptor,该接口定义如下:

Public interfaceMethodInterceptor extends Interceptor{

Object invoke(MethodInvocation invocation)throws Throwable;

}

通过MethodInterceptorinvoke方法的MethodInvocation参数,我们可以控制对相应的Joinpoint的拦截行为。通过调用MethodInvocationproceed()方法,可以让程序执行继续沿着调用链传播。如果在哪一个MethodInterceptor中没有调用proceed(),那么程序的执行将会在当前MethodInterceptor处“短路”,Joinpoint上的调用链将被中断,同一Joinpoint上的其他MethodInterceptor的逻辑以及Joinpoint出的方法逻辑将不会被执行。

<!--[if !supportLists]--> 2.Spring AOP中的Aspect

AdvisorSpring中用的Aspect。但是,与正常的Aspect不同,Advisor通常只持有一个Pointcut和一个advice。而理论上,Aspect定义中可以有多个Pointcut和多个Advice。所以,我们认为advisor是一种特殊的Aspect

<!--[if !supportLists]--> 3.Spring AOP的织入

Spring AOP中,使用类org.springframework.aop.framework.ProxyFactory作为织入器。在IoC容器中,使用org.springframework.aop.framework.ProxyFactoryBean作为织入器。

AspectJ采用ajc编译器作为织入器。JBOSS AOP使用自定义的ClassLoader作为织入器)

AOP思想深入学习的资料

  • 2012年08月22日 15:55
  • 902KB
  • 下载

Aop编程思想

  • 2014年11月08日 16:45
  • 19KB
  • 下载

Filter,一种aop编程思想的体现

一、filter简介filter是Servlet规范里的一个高级特性,只用于对request、response的进行修改。filter提出了FilterChain的概念,客户端请求request在抵达...
  • forezp
  • forezp
  • 2016年12月18日 21:52
  • 12197

《Spring设计思想》AOP设计基本原理

目录(?)[+] 前言Java程序运行在JVM中的特征Java程序执行流 了解AOP连接点Join Point切入点point cut   的概念 引入了代理模式的Java程序执行流AOP实...
  • pfnie
  • pfnie
  • 2016年06月02日 15:15
  • 276

Java动态代理+注解体现Spring AOP思想

在MVC的架构中,优秀的代码是Service业务层只做业务逻辑处理,如果要添加新功能(如日志,事务等),不应该污染业务层代码。 讲得很抽象,简单来说,如果我要在业务层添加日志功能,在业务层代码内...
  • antgan
  • antgan
  • 2017年07月31日 15:48
  • 307

Spring全家桶(八)AOP核心思想与AspectJ 5种类型通知

一、AOP核心思想AOP是Aspect-Oriented Programming的缩写,翻译为面向切面编程。我个人理解切面就是一个方面。 例子,一个接口里面有增删改查四个方法:package com...
  • napoay
  • napoay
  • 2017年05月17日 00:02
  • 990

Aop_面向切面编程(1)_思想理解

Aop的基本思想 开发人员在编写应用程序时,通常包含两种代码:一种是和业务系统有关系的代码,一种是和业务系统关系不大的代码,例如日志,事务处理,权限处理等等。以前的程序中,这两种代码是写...

《Spring设计思想》AOP设计基本原理

《Spring设计思想》AOP设计基本原理 原创 2016年...

Spring的AOP思想研究和实现

AOP思想在Spring中使用最多的是事务管理。在没有AOP之前的时候都是使用OOP的思想按照纵向的方向来编程。哪里需要事务,哪里不需要,需要什么样的事务。因此,导致了很多繁琐的操作。现在AOP思想面...

Spring的AOP思想和实践

引言        大家都知道Spring中最最牛逼的就是IOC/DI :控制反转/依赖注入,AOP: 面向切面编程,两个核心,如果说Spring是一个牛逼的框架,不如它是一个思想的引导者,Sprin...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AOP思想
举报原因:
原因补充:

(最多只允许输入30个字)