Spring 实战-第4章 面向切面的Spring

.1.1 定义AOP术语
与大多数技术一样,AOP已经形成了自己的术语。描述切面的常用术语有通知(advice)、切点
(pointcut)和连接点(join point)。图4.2展示了这些概念是如何关联在一起的。

  

 

把这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的问题。

如果要重用通用功能的话,最常见的面向对象技术是继承(inheritance)或委托(delegation)??。但是,如果在整个应用中都使用相同的基类,继承往往会导致一个脆弱的对象体系;而使用委托可能需要对委托对象进行复杂的调用。

切面提供了取代继承和委托的另一种可选方案,而且在很多场景下更清晰简洁。

 

在AOP术语中,切面的工作被称为通知。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。它应该应用在某个方法被调用之前?之后?之前和之后都调用?还是只在方法抛出异常时调用?

Spring切面可以应用5种类型的通知:


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

 

虽然如此,Spring和AspectJ项目之间有大量的协作,而且Spring对AOP的支持在很多方面借鉴了AspectJ项目。

Spring提供了4种类型的AOP支持:

基于代理的经典Spring AOP;
纯POJO切面;
@AspectJ注解驱动的切面;
注入式AspectJ切面(适用于Spring各版本)。
前三种都是Spring AOP实现的变体,Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截。

 在Spring AOP中,要使用AspectJ的切点表达式语言来定义切点。关于Spring AOP的AspectJ切点,最重要的一点就是Spring仅支持AspectJ切点指示器(pointcut

designator)的一个子集

 

在Spring AOP中,要使用AspectJ的切点表达式语言来定义切点。
  1.Spring AOP支持的AspectJ指示器:
    1)arg():限制连接点匹配参数为制定类型的执行方法。
    2)@args():限制连接点匹配参数由指定注解标注的执行方法。
    3)execution():用于匹配时连接点的执行方法。
    4)this():限制连接点匹配AOP代理的bean引用为制定类型的类。
    5)target:限制连接点匹配目标对象为制定类型的类。
    6)@target:限制连接点匹配特定的执行对象,这些对象对应的类要有指定类型的注解。
    7)within():限制连接点匹配指定的类型。
    8)@within():限制连接点匹配指定注解所标注的类型,当使用Spring AOP时,方法定义在由指定的注解所标注的类里。
    9)@annotation:限制匹配带有指定注解的连接点。
  在Spring中尝试使用其他的AspectJ其他指示器时,会抛出IllegalArgumentException异常。
  2.除了上述的AspectJ指示器外,Spring还引入了一个新的指示器:
  bean():使用bean ID或bean 名称作为参数来限定切点只匹配特定的bean。

    

  executation指示器是实际执行匹配,其他的指示器都是用来限制匹配的。

 

 

4.3 使用注解创建切面

使用注解来创建切面是AspectJ 5所引入的关键特性。AspectJ 5之前,编写AspectJ切面需要学习一种Java语言的扩展,但是AspectJ面向注解的模型可以非常简便地通过少量注解把任意类转变为切面。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

拓展--很多理解,很难看懂

AOP与JAVA动态代理 - wencenty - 博客园
https://www.cnblogs.com/xiaoxiao7/p/6057724.html

 

AOP里的公民

  • Joinpoint:拦截点,如某个业务方法
  • Pointcut:Joinpoint的表达式,表示拦截哪些方法。一个Pointcut对应多个Joinpoint
  • Advice:要切入的逻辑
  • Before Advice:在方法前切入
  • After Advice:在方法后切入,抛出异常则不会切入
  • After Returning Advice:在方法返回后切入,抛出异常则不会切入
  • After Throwing Advice:在方法抛出异常时切入
  • Around Advice:在方法执行前后切入,可以中断或忽略原有流程的执行

 

公民之间的关系

织入器通过在切面中定义pointcout来搜索目标(被代理类)的JoinPoint(切入点),然后把要切入的逻辑(Advice)织入到目标对象里,生成代理类

   

 

posted @ 2019-02-25 17:20  海蓝7  阅读(195)  评论(0)    收藏  举报