zoukankan      html  css  js  c++  java
  • Atitit aop的一些资料 目录 2. AOP(面向切面) 1 2.1.   切面(Aspect):其实就是共有功能的实现。如日志切面、权限切面、事务切面等 2 2.2.   通知(Advice

    Atitit aop的一些资料

     

    目录

    2. AOP(面向切面) 1

    2.1.   切面(Aspect):其实就是共有功能的实现。如日志切面、权限切面、事务切面等 2

    2.2.   通知(Advice):是切面的具体实现。前置通知(Before)、后置通知(AfterReturning)环绕通知(Around) 2

    2.3.   连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。 3

    2.4. 切入点(Pointcut):用于定义通知应该切入到哪些连接点上。 3

    3. 切入方式 3

    3.1. 按照package 类切入 3

    3.2. 按照某个方法切入execution(* aoppkg.UserService.login(..) 4

    3.3. 4

    3.4. 按照某个注解 4

    1.  
    2. AOP(面向切面)

     

     

    在传统的编写业务逻辑处理代码时,我们通常会习惯性地做几件事情:日志记录、事务控制及权限控制等,然后才是编写核心的业务逻辑处理代码。当代码编写完成回头再看时,不禁发现,扬扬洒洒上百行代码中,真正用于核心业务逻辑处理才那么几行,如图6-4所示。方法复方法,类复类,就这样子带着无可奈何遗憾地度过了多少个春秋。这倒也罢,倘若到了项目的尾声,突然决定在权限控制上需要进行大的变动时,成千上万个方法又得一一"登门拜访",痛苦"雪上加霜"。

     

     

     

     如果能把图6-4中众多方法中的所有共有代码全部抽取出来,放置到某个地方集中管理,然后在具体运行时,再由容器动态织入这些共有代码的话,最起码可以解决两个问题:

     

      1. Java EE程序员在编写具体的业务逻辑处理方法时,只需关心核心的业务逻辑处理,既提高了工作效率,又使代码变更简洁优雅。

     

      2. 在日后的维护中由于业务逻辑代码与共有代码分开存放,而且共有代码是集中存放的,因此使维护工作变得简单轻松。

     

     

     

    面向切面编程AOP技术就是为解决这个问题而诞生的,切面就是横切面,如图6-5所示,代表的是一个普遍存在的共有功能,例如,日志切面、权限切面及事务切面等:

     

     

     

      下面我们以用户管理业务逻辑组件UserService的AOP实现过程(见图6-6)为例,深度剖析一下AOP技术的实现原理。AOP技术是建立在Java语言的反射机制与动态代理机制之上的。业务逻辑组件在运行过程中,AOP容器会动态创建一个代理对象供使用者调用,该代理对象已经按Java EE程序员的意图将切面成功切入到目标方法的连接点上,从而使切面的功能与业务逻辑的功能同时得以执行。从原理上讲,调用者直接调用的其实是AOP容器动态生成的代理对象,再由代理对象调用目标对象完成原始的业务逻辑处理,而代理对象则已经将切面与业务逻辑方法进行了合成。

     

     

     

    现将图6-6中涉及到的一些概念解释如下。

     

      1.   切面(Aspect):其实就是共有功能的实现。如日志切面、权限切面、事务切面等

    。在实际应用中通常是一个存放共有功能实现的普通Java类,之所以能被AOP容器识别成切面,是在配置中指定的。

     

      1.   通知(Advice):是切面的具体实现。前置通知(Before)、后置通知(AfterReturning)环绕通知(Around)

    以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种。在实际应用中通常是切面类中的一个方法,具体属于哪类通知,同样是在配置中指定的。

     

      1.   连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。

    例如,方法调用、异常抛出或字段修改等,但Spring只支持方法级的连接点。

     

      1. 切入点(Pointcut):用于定义通知应该切入到哪些连接点上。

    不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。

     

      目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码了,所有的共有功能代码等待AOP容器的切入。

     

      代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。

     

      织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现。

     

     

     

    综上所述:AOP(面向切面)其实就是将一个程序所需要用到的所有共有代码全部抽取出来,放置到某个地方集中管理,然后在具体运行时,再由容器动态织入这些共有代码。

    ---------------------

     

     

    1. 切入方式
      1. 按照package 类切入

     

      1. 按照某个方法切入execution(* aoppkg.UserService.login(..)

     

      1. 按照某个注解
    •  

    有一个 @Transactional 注解的目标对象中的任意连接点(在Spring AOP中只是方法执行)

    •  

    @target(org.springframework.transaction.annotation.Transactional)

    • '@target' 也可以在binding form中使用:请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
    •  

    任何一个目标对象声明的类型有一个 @Transactional 注解的连接点(在Spring AOP中只是方法执行)

    •  

    @within(org.springframework.transaction.annotation.Transactional)

    • '@within'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
    •  

    任何一个执行的方法有一个 @Transactional annotation的连接点(在Spring AOP中只是方法执行)

    •  

    @annotation(org.springframework.transaction.annotation.Transactional)

    •  

     

     

    pointcut 切面表达式 切入点表达式 - duenboa - 博客园.html

  • 相关阅读:
    让盘古分词支持最新的Lucene.Net 3.0.3
    Mac下配置GitTF来连接TFS2012
    基于Xcode4开发第一个iPhone程序:“Hello World”
    第二个iPhone应用程序:“Say Hello”
    基于MMSeg算法的中文分词类库
    为什么IDEA不推荐你使用@Autowired ?
    Spring Cloud Gateway自定义过滤器实战(观测断路器状态变化)
    Spring Cloud Gateway实战之五:内置filter
    Spring Cloud Gateway过滤器精确控制异常返回(分析篇)
    Spring Cloud Gateway实战之四:内置predicate小结
  • 原文地址:https://www.cnblogs.com/attilax/p/15197452.html
Copyright © 2011-2022 走看看