spring-5-注解方式生成切面
2020-06-22 本文已影响0人
blank_white
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="serverAspect" class="com.spyouth.service.AspectServer"></bean>
package com.spyouth.service;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
//表明此类是一个注解类
@Aspect
public class AspectServer {
// value 值为切入点,用 execution 表达式表示,
// execution 写法搜索 execution 表达式
//以方法名标记一种切入点
@Pointcut(value = "execution(* com..*.do*())")
public void cutPoint(){}
//方法的名字自定义,参数列表自定义
@Before(value = "execution(* com..*.do*())")
public void before(JoinPoint jp){
System.out.println("Aspect before");
//方法的参数如果设置了 JoinPoint ,则可以通过此变量获取关于切入点的一些属性
jp.getSignature();
jp.getSignature().getName();
jp.getArgs();
}
//在方法执行前后都可以,和 jdk 动态代理的 invoke 方法相似
//
@Around(value = "cutPoint()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("Aspect around before");
//执行切入点方法,和 invoke 方法中的 method.invoke 类似
//若果不加这句话,就不会执行切入点了
Object o=pjp.proceed();
System.out.println("Aspect around after");
// o= "改变了";
// 能更改切入点的返回值
return o;
}
//在切入点返回后执行
//切入点也可以用函数名,前提是前面的那个把函数名作为切入点 id 了
@AfterReturning(value = "cutPoint()",returning = "result")
public void afterReturn(Object result){
System.out.println("Aspect after returning");
//是把切入点的返回值赋给了 Object result
//所以修改 result 并不能修改 切入点的返回值
//但如果 result 引用类型,result 和 切入点返回值,都指向的是相同的对象
//则可以通过如 result.setName() result.name="xxxx" 改变对象的成员值
}
//在切入点执行出现异常时,相当于 catch 中
@AfterThrowing(value = "cutPoint()",throwing = "ex")
public void afterThrowing(Throwable ex){
System.out.println("Aspect afterThrowing "+ex.getMessage());
}
//在切入点执行后,及时切入点 执行时出现异常,相当于 finally 中
@After(value = "cutPoint()")
public void after(){
System.out.println("Aspect after ");
}
}