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作为织入器)

Spring AOP思想的理解和简单实现

Spring之Aop的简单实现 所谓Aop,即Aspect Oriented Programming,面向方面编程。这个概念听起来可能有点抽象,所以在这里我们先引入Aop中的一些术语并结合它们来...
  • qq_405930170
  • qq_405930170
  • 2015年04月16日 11:51
  • 1587

AOP思想实例讲解

 假设有一个系统,需要权限控制,按oo的方法,做个SecurityManager, just like this:public class SecurityManager{public bool ch...
  • greenyork
  • greenyork
  • 2009年08月28日 13:00
  • 3459

实现aop思想的多种方法

含义: AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP是OOP的延续,是...
  • Scythe666
  • Scythe666
  • 2016年07月22日 14:44
  • 1167

Spring中的AOP思想

AOP的概念:         AOP全称为Aspect Oriented Programming,意为“面向切面编程”,现在是软件开发中的一个热点,也是spring框架中的一种衍生范型。利用AOP...
  • haofeijina
  • haofeijina
  • 2016年10月15日 00:12
  • 618

Java技术积累——AOP思想之Filter的使用

在.NET中也曾介绍过关于Filter的使用。它是AOP思想的一个很重要的应用。同样在Java中同样也是支持filter的。在这里仅以温故的目的再总结一下filter的一些基础知识点。 1、.net ...
  • wangyy130
  • wangyy130
  • 2015年09月24日 15:10
  • 1275

轻松理解AOP(面向切面编程)

Spring如此流行,当我第一次接触Spring的时候,到网上看了一些文章,都讲得神乎其乎,最后我篇也没看懂,我当时就是认为这个东西一定很高深,于是我就遇到做WEB开发的人就会打听一下。得到最多的一个...
  • yanquan345
  • yanquan345
  • 2014年02月24日 20:47
  • 6535

Spring AOP 实现和一些核心思想

1.什么是AOP     AOP(Aspect Oriented Programming) 即面向切面编程,是设计模式的延续。设计模式追求的是调用者和被调用者之间的解耦。 AOP 可以说是对此目...
  • rose_zz
  • rose_zz
  • 2013年11月03日 14:57
  • 1951

深入理解Aop编程思想

Aop(Aspect-Oriented Programming,面向切面编程),可以说是oop(面向对象编程)的一个补充和完善,为啥这样说呢?我们都知道oop将我们的程序很好的用继承,封装,多态实现了...
  • u010214269
  • u010214269
  • 2015年08月08日 23:19
  • 2625

Filter过滤器(拦截器)实现AOP思想

Filter过滤器(拦截器)实现AOP思想 Filter过滤器(拦截器)的使用是声明试的。即只需在web.xml配置文件中做简单的声明就Filter就能发挥作用。 实现过滤器简单的三个步骤就...
  • wangqingbo0829
  • wangqingbo0829
  • 2016年02月26日 10:01
  • 700

Spring——AOP核心思想与实现

AOP(Aspect Oriented Programming):面向切面编程 核心思想:动态的添加和删除切面上的逻辑而不影响原来的执行代码AOP相关概念:1.JoinPoint 连接点,加入切面...
  • VirusLL
  • VirusLL
  • 2017年07月26日 16:03
  • 408
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AOP思想
举报原因:
原因补充:

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