Java AOP实现和应用
Java中常使用到AOP功能,实现AOP分三步:
1,定义一个切面类,类前加@component注解,使该类注入spring的IOC容器中,使之受spring管理,同时类前加@Aspect注解,使该类成为切面类,定义了是什么,即解决What的问题;
2,在切面类中的实现了某些功能的各个方法前加上如下相应注解,定义切入的时间点,解决When的问题:
@Before(value="该方法作用的目标表达式"),前置通知,例如;
@Before(value="myPonitcut01()")
public void beforeExecute(JoinPoint joinPoint){
//...方法执行前的处理...
}
@AfterReturning(value="该方法作用的目标表达式",returning="result"),返回值通知,其中result要与方法中对应参数名一样,例如;
@AfterReturning(value="myPonitcut01()", returning="result")
public void afterExecute(JoinPoint joinPoint, Object result){
//...方法返回值时的处理...
}
@After(value="该方法作用的目标表达式"),后置通知,例如;
@After(value="myPonitcut01()")
public void afterExecute(JoinPoint joinPoint) throws Throwable{
//...方法执行后的处理...
}
@AfterThrowing(value="该方法作用的目标表达式",throwing="e"),异常通知,其中 e 要与方法中对应参数名一样,例如;
@AfterThrowing(pointcut = "myPonitcut01()", throwing="e")
public void afterThrowing(JoinPoint joinPoint, Throwable e){
//...方法执行报异常时的处理...
}
@Around(value="该方法作用的目标表达式"), 环绕通知,注意这里的方法参数是 ProceedingJoinPoint,例如:
@Around(value="myPonitcut01()")
public void aroundExecute(ProceedingJoinPoint joinPoint) throws Throwable{
//...方法执行前后的处理...
}
上面各个注解的value值如果有多个表达式可用 与&& 或|| 非!进行相应连接,即跟平时写的Java代码的与或非一样,例如;
@Before(value="myPonitcut01() || myPonitcut02()")
public void beforeExecute(JoinPoint joinPoint){
//...方法执行前的处理...
}
3,定义方法作用的目标表达式,解决在哪里应用切面类方法的问题,即解决了Where的问题,一般为:
execution(* com.xxx.yyy.kkk.*.*(..)),或者 //任意返回类型,不指定方法修饰符,如public方法
execution(public * com.xxx.yyy.kkk.*.*(..)),//任意返回类型,指定方法修饰符仅public方法
也可以在切面类的定义某个返回void的方法(如:myPonitcut01())前加注解
@Pointcut(value="切入点作用的目标表达式"),或者
@Pointcut(value="@annotation(com.aa.bb.cc.某个已有或自定义的注解类") ,
然后在AOP的第2步中的各个注解的value中使用该方法,例如@Before(value="myPonitcut()"),目的是取得切入点作用的目标表达式;
欢迎拍砖讨论...