Spring对AspectJ的支持

在Spring中配置@AspectJ

  • 对@AspectJ支持可以使用XML或Java风格的配置
  • 确保AspectJ的aspectweaver.jar库包含在应用程序(版本1.6.8或更高版本)的classpath中
  • @纵横切面使用方面注解配置,拥有@Aspect的任何豆将被弹簧自动识别并应用
  • 用@Aspect注解的类可以有方法和字段,他们也可能包括切入点(切入点),通知(咨询)和引用(介绍)声明
  • @Aspect注解时不能够通过类路径自动检测发现的,所以需要配合使用组件注释或者在xml配置bean

pointcut

  • 一个切入点通过一个普通的方法定义来提供,并且切入点表达式使用@Pointcut注解,方法返回类型必须为void
  • 定义一个名为’anyOldTransfer’,这个切入点将匹配任何名为“transfer”的方法的执行

    支持的切入点指示符

    • execution:匹配方法执行的连接点
    • within:限定匹配特定类型的连接点
    • this:匹配特定连接点的豆引用是指 类型实例的限制
    • target:限定匹配特定连接点的目标对象是指定类型的实例
    • args:限定匹配特定连接点的参数是给定类型的实例
    • @target:限定匹配特定连接点的类执行给定类型的注解
    • @args:限定匹配特定连接点实际传入参数的类型具有给定类型的注解
    • @within:限定匹配到内具有给定的注释类型的连接点
    • @annotation:限定匹配特定连接点的主题具有给定的注解

组合切入点
- 切入点表达式可以通过&&,||和!进行组合,也可以通过名字引用切入点表达式-
- 通过组合,可以建立更加复杂的切入点表达式
- @Pointcut( “anyPublicOperation()&& inTrading()”)“

定义良好的切入点

  • Aspectj是编译期的AOP
  • 检查代码并匹配连接点与切入点的代价是昂贵的
  • 一个好的切入点应该包括以下几点
    1、选择特定类型的连接点,如:execution,get,set,call,handler
    2、确定连接点范围,如:within,withincode
    3、匹配上下文信息,如:this,target, @ annotation

Stpring AOP可以处理泛型类的声明和使用方法的参数

  • 通知和切入点注解有一个额外的“argNames”属性,它 可以用来指定所注解的方法的参数名
  • 如果第一参数是一个JoinPoint,ProceedingJoinPoint,JoinPoint.StaticPart,那么可以忽略它

简介

  • 允许一个切面声明一个通知对象实现制定接口,并且提供了一个接口实现类来代表这些对象
  • introduction使用@DeclareParents进行注解,这个注解用来定义匹配的类型拥有一个新的parent
  • 例如:给定一个接口UsageTracked,并且该接口拥有DefaultUsageTracked的实现,接下来的切面声明了所有的service接口的实现都实现了UsageTracked接口
    @Aspect      
    public class UsageTracking {    

    @DeclareParents(value =“main.java.com.service.* +",defaultImpl = DefaultUsageTracked.class)
    public static UsageTracked usageTracked; 

    @Before("main.java.com.SystemArchitecture.busineddService()&& this(usageTracked)")  
    public void recordUsage(UsageTracageTracked){       
        usageTracked.incrementUseCount();
    }

切面实例化模型

  • 这是一个高级主题
  • “perthis”切面通过指定@Aspect注解perthis子句实现
  • 每个独立的service对象执行时对会创建一个切面实例
  • service对象的每个方法在第一次执行的时候创建切面实例,切面在service对象失效的同时也失效

AspectJ小结

  • 配置@AspectJ
  • Pointcut连接点
  • Advice通知

你可能感兴趣的