JavaSpring【七、AspectJ】

AspectJ 概念

  • @AspectJ类似纯Java注解的普通Java类
  • Spring可以使用AspectJ来作为切入点
  • AOP在运行时仍是纯SpringAOP,对AspectJ无依赖

配置:

  • 对@AspectJ可以使用XML方式配置或Java注解风格配置
  • 确保使用AspectJ1.6.8以上版本的AspectJweaver.jar

xml风格:
aop:aspectj-autoproxy

注解风格:
@Configuration
@EnableAspectJAutoProxy

AspectJ注解

  • @Aspect-切面实现类(不能被自动检测,需要配合@Component一起使用)
    Aspect 标注的类会从代理中排除,否则会造成死循环
  • @Pointcut-切入点方法声明
    切入点方式类型

    切入点只能声明在返回类型为void的空方法上(原则是简单、单一)
    可以包含参数,如@Pointcut("myPointcut() && args(a,b..)")
    组合Pointcut 可以通过&& || ! 将声明好的切入点方法名进行组合
    好的切入点应包含一下几个方面
  • 选定特定类型:execution、get、set、call、handler
  • 确定范围:within、whthincode
  • 匹配上下文信息:this、target、@annotation

Advice-通知

@Before("myPointcut() && args(a,b..)")//此处args为可选项,即为Before注解的方法的入参
@Before("myPointcut(a,b..)")//与上面一种方式等价

@AfterReturning("pointcut路径")//这里的路径可以是完整的包名,也可以是已经声明好的pointcut方法名,如myPointcut()
@AfterReturning(pointcut="myPointcut()",returning="retVal")//这里的返回值,可以用于注解的方法的入参

@AfterThrowing(pointcut="myPointcut()",throwing="ex")//这里的抛出,可以用于注解的方法的入参

@After("myPointcut()")

@Around("myPointcut()")//注解方法需要有一个入参ProceedingJoinPoint,调用pjp.proceed()来执行切入点方法

使用注解引入参数
1、定义一个注解
2、在切入点方法上使用注解,并声明注解的值
3、在通知方法上使用 && @Annotation(注解名) 声明使用注解作为入参,并将通知方法的入参定义为该注解,即可以在通知方法中使用注解的.value()方法获取切入点方法的注解值

argNames属性可以指定注解的参数名称,若第一个参数是JoinPoint、ProceedingJoinPoint、JoinPoint.StaticPart,可以忽略

  • Introduction-引入
    @DeclareParents(value="匹配",defaultImpl=xxx.class)-用以声明Introduction

Perthis-Aspect注解的子句实现

@Aspect("perthis()")--每个独立的service执行时都创建一个切面实例,在service对象的每个方法第一次执行时创建实例,在service对象失效时同时失效

posted @ 2017-05-09 16:50  l.shane  阅读(225)  评论(0编辑  收藏  举报