zoukankan      html  css  js  c++  java
  • 四、Spring-面向切面编程

    内容

    • 面向切面编程基本原理
    • 通过POJO创建切面
    • 使用@AspectJ注解
    • 为AspectJ切面注入依赖

    关键词

    • 横切关注点(cross-cutting concern)
    • 继承 (inheritance)
    • 委托 (delegation)
    • 通知 (advice)
    • 切点 (pointcut)
    • 连接点 (join point)

    4.1 面向切面编程

    日志是应用切面的常见范例,其他常见还包括声明式事务、安全和缓存

    那么什么是切面编程?

    在代码中的一个地方定义通用功能,通过声明的方式被调用,而无需修改其他类。那么该模块化的特殊类,就被称之为切面(Aspect)。可以使关注代码集中管理,而不是分散式管理;服务模块更加简洁,更多的关注于核心代码,而切面类的代码就可以使次要关注点。

    4.1.1 定义AOP术语

    • 通知 (advice)
    • 切点 (pointcut)
    • 连接点 (join point)

    通知:切面的工作被称之为通知。通知定义了切面是什么以及何时使用,还解决了什么时候执行的问题。

    五种类型的通知

    名词 说明
    前置通知(Before) 在目标方法被调用之前调用通知功能
    后置通知(After) 在目标方法完成之后调用通知,此时不会关心方法的输出是什么
    返回通知(After-returning) 在目标方法执行成功后通知
    异常通知(After-throwing) 在目标方法抛出异常后通知
    环绕通知(Around) 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

    连接点:是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至是修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。

    切点:通知定义了“何时”和“什么”,那么切点就定义了“何处”。切点的定义通常会匹配通知所要织入的一个或多个连接点。通常会指定明确的类或者方法,但是也会使用正则等进行类和方法的匹配。

    切面:切面=通知+切点;即阐明了“何时”在“何处”执行了“什么”。

    引入(Introduction):引入允许我们向现有的类添加新方法或属性

    织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入。

    • 编译期:切面在目标类编译时被织入。
    • 类加载期:切面在目标类加载到JVM时被织入。
    • 运行期:切面在应用运行的某个时刻被织入。

    4.2 切点表达式语言

    AspectJ指示器 描述
    arg 限制连接点匹配参数为指定类型的执行方法
    @args() 限制连接点匹配参数为指定注解的执行方法
    execution() 用于匹配时连接点的执行方法
    this() 限制连接点匹配AOP代理的bean引用为指定类型的类
    target 限制连接点匹配目标对象为指定类型的类
    @target() 限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解
    within() 限制连接点匹配指定的类型
    @within() 限制连接点匹配指定注解所标注的类型
    @annotation 限制连接点匹配带有指定注解的连接点
     1. execution(* concert.Performance.perform(..))
     * 为返回任意类型
     concert.Performance为方法所属类
     perform 方法
     (..) 任意参数
    
     2. execution(* concert.Performance.perform(..) &&(||、!) within(concert.*))
     可以使用与或非和其他关系关联
    
    

    使用AspectJ注解来声明通知方法

    注解 描述
    @Before 通知方法会在目标方法调用之前执行
    @After 在目标方法完成之后调用通知,此时不会关心方法的输出是什么
    @After-returning 在目标方法执行成功后通知
    @After-throwing 在目标方法抛出异常后通知
    @Around 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
    @PointCut 在一个@AspectJ切面内定义可重用的切点

    4.2.1 @Around

    @Around注解表明一个方法会作为该切点的环绕通知,也可以理解为前置+后置的总和。但是现在会放置在一个方法中,而不会分布在其他其他不同的方法里。而且,在新的通知方法里,ProceedingJointPoint jp必须作为参数。这个对象必须要有而且也不要忘记调用jp.proceed()方法来执行源方法。

    谁不是孤身一人,翻山越岭
  • 相关阅读:
    五个Metro UI 风格的网页设计
    cocos2dx学习资料(转)
    Python性能鸡汤
    7款很棒的 HTML5 视频播放器
    优秀的后台管理界面设计案例分享
    Task的理解(转)
    超棒的20款javascript工具提示条(tooltips)类库(转)
    Xcode 证书生成、设置、应用(转)
    分享17个漂亮的电子商务网站(转)
    强烈免费25款商务logo设计模板(转)
  • 原文地址:https://www.cnblogs.com/hasz/p/12984851.html
Copyright © 2011-2022 走看看