AOP——@AspectJ

  • 启动@AspectJ支持

通过在Spring配置中引入下列元素来启用Spring对@AspectJ的支持:

 

  • 声明一个切面

启用@AspectJ支持后,在application context中定义的任意带有一个@Aspect切面的bean都将被Spring自动识别并用于配置Spring AOP。

 

  • 声明一个切入点

方法切入点函数

execution():表示满足某一匹配模式的所有目标类方法连接点。

@annotation():表示标注了特定注解的目标方法连接点。

 

方法入参切入点函数

args():通过判别目标类方法运行时入参对象的类型定义指定连接点。如args(com.pms.Log)表示所有有且仅有一个按类型匹配于Log入参的方法。

@args():通过判别目标方法运行时入参对象的类是否标注特定注解来指定连接点。如@args(com.pms.Log)表示任何这样的一个目标方法:它有一个入参且入参对象的类标注@Log注解。

 

目标类切入点函数

within():表示特定域下的所有连接点。如within(com.pms.service.*)表示com.pms.service包中的所有连接点,即包中所有类的所有方法,而within(com.pms.service.*Service)表示在com.pms.service包中所有以Service结尾的类的所有连接点。

target():假如目标类按类型匹配于指定类,则目标类的所有连接点匹配这个切入点。如通过target(com.pms.Log)定义的切入点,Log以及Log实现类中所有连接点都匹配该切入点。

@within():假如目标类按类型匹配于某个类A,且类A标注了特定注解,则目标类的所有连接点匹配这个切入点。如@within(com.pms.Log)定义的切入点,假如LogService类标注了@Log注解,则LogService以及其实现类的所有连接点都匹配。

@target():目标类标注了特定注解,则目标类所有连接点匹配该切点。如@target(com.pms.Log),假如LogService标注了@Log,则LogService所有连接点匹配切入点。

 

代理类切入点函数

this():代理类按类型匹配于指定类,则被代理的目标类所有连接点匹配切入点。

 

在函数中使用通配符

匹配任意字符,但它只能匹配上下文中的一个元素

..  匹配任意字符,可以匹配上下文中的多个元素,但在表示类时,必须和*联合使用,而在表示入参时则单独使用

表示按类型匹配指定类的所有类,必须跟在类名后面,如com.pms.Log+。继承或扩展指定类的所有类,同时还包括指定类本身。

 

@AspectJ函数按其是否支持通配符及支持的程度,可以为以下3类

支持所有通配符:execution(),within()

仅支持+通配符:args(),this(),target()

不支持通配符:@args(),@within(),@target(),@annotation()

 

  • 声明通知

前置通知:@Before

后置通知:@AfterReturing,有时候你需要在通知体内得到返回的值。

 

@Aspect
public class AfterReturingExample{
  @AfterReturing(
    pointcut="com.pms.Log.log()",
    returing="retVal"
  )
  public void doSome(Object retVal){
    ...
  }
}

 

 异常通知:@AfterThrowing,有时候你需要在通知体内得到异常值。类似上面后置通知,这时属性为throwing="ex"。

最终通知:@After。

环绕通知:@Around。

 

访问当前的连接点

 任何通知方法可以将第一个参数定义为org.aspectj.lang.JoinPoint类型。JoinPoint接口提供了一系列有用的方法,比如getArgs(),getThis(),getTarget()等。

 

 

 

 

你可能感兴趣的:(spring)