您的位置:首页 > 编程语言 > Java开发

Spring——aop(面向切面编程)

2017-04-11 15:07 381 查看
AOP(Aspect Oriented Programming):

    面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。

    在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

主要功能:

    日志记录,性能统计,安全控制,事务处理,异常处理等等。

主要意图:

    将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

AOP/OOP:

区分:

    AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。

    而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。

    上面的陈述可能过于理论化,举个简单的例子,对于“雇员”这样一个业务实体进行封装,自然是OOP/OOD的任务,我们可以为其建立一个“Employee”类,并将“雇员”相关的属性和行为封装其中。而用AOP设计思想对“雇员”进行封装将无从谈起。

    同样,对于“权限检查”这一动作片断进行划分,则是AOP的目标领域。而通过OOD/OOP对一个动作进行封装,则有点不伦不类。

    换而言之,OOD/OOP面向名词领域,AOP面向动词领域。

关系:

    很多人在初次接触 AOP 的时候可能会说,AOP 能做到的,一个定义良好的 OOP 的接口也一样能够做到,我想这个观点是值得商榷的。AOP和定义良好的 OOP 的接口可以说都是用来解决并且实现需求中的横切问题的方法。但是对于 OOP 中的接口来说,它仍然需要我们在相应的模块中去调用该接口中相关的方法,这是 OOP 所无法避免的,并且一旦接口不得不进行修改的时候,所有事情会变得一团糟;AOP 则不会这样,你只需要修改相应的
Aspect,再重新编织(weave)即可。 当然,AOP 也绝对不会代替 OOP。核心的需求仍然会由 OOP 来加以实现,而 AOP 将会和 OOP 整合起来,以此之长,补彼之短。

系统级,大部分都使用的功能做为切面,实现系统级的代码加到业务代码中,使用代理设计模式(详见设计模式——代理设计模式)。

基于@AspectJ注解的SpringAOP

基于CJLIB的方式,使用方法拦截器。

AOP名词解释:

1、切面(Aspect):

    一个关注点的模块化,这个关注点可能会横切对个对象。

    在Spring AOP中,切面可以使用基于@Aspect注解的方式实现。

2、连接点(JoinPoint):

    在程序执行过程中某个特定的点,在Spring AOP中,一个连接点总是表示一个方法的执行。

3、通知(Advice):

    在切面的某个特定的连接点上执行的动作。其中包括了“around”、“before”和“after”等不同类型的通知。

4、切入点(Pointcut):

    匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

通知类型:

1.  前置通知(@Before ):在某连接点之前执行的通知。

2.  后置通知(@AfterReturning ):正常完成后执行的通知。

3.  异常通知(@AfterThrowing):在方法抛出异常时的通知。

4.  最终通知(@After ):退出的时候执行的通知。

5.  环绕通知(@Around):包围连接点的通知。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常。
基于@AspectJ注解的SpringAOP

1.  启用@AspectJ支持

<aop:aspectj-autoproxy/>

2.  声明一个切面

@Aspect

3.  声明一个切入点(pointcut)

@Pointcut(“切入点表达式”)

@Pointcut("execution (* com.biz..*.*(..)) ")

execution 断言的关键字

* 所有返回类型

com.biz.. 这个包和所有的子包

*.* 所有类的方法

(..) 所有方法参数

4.  声明通知

        环绕通知(@Around)使用ProceedingJoinPoint做为参数,其他通知使用JoinPoint类型。

        ProceedingJoinPoint类的proceed()方法调用拦截的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring aop