文章目录
1.使用Aspect的参数JoinPoint
/**
* 做一个有参数的切面函数
* <p>
* 指定通知方法的参数:JoinPoint
* <p>
* 作用是:在这个方法执行的时候,这个方法把它的所有信息传给这个代理,这个代理通过JoinPoint获取参数
* JoinPoint是由框架赋值的,不要手动,赋值,但是必须得是第一个位置,就是这个函数可以有多个参数
* 但是使用JoinPoint必须是放在第一个函数里面
*/
@After(value = "execution(public void org.example.ba1.SomeServiceImpl.doSome(String,Integer))")
public void myLater(JoinPoint jp) {
System.out.println("获取他的定义方法" + jp.getSignature());
System.out.println("方法的名称" + jp.getSignature().getName());
//获取方法的参数,是一个object的数组
Object args[] = jp.getArgs();
for (Object age : args) {
System.out.println("参数" + age);
}
2.使用后置通知@AfterReturning
/**
* 后置通知,这个value是切入点,之后的returning是切入点的这个函数执行后返回的object类型的对象
* 这个@AfterReturning的returning的值必须要和下面的函数的参数名称相同
* @param res
*/
@AfterReturning(value="execution(* *..doOther(..))",returning = "res")
public void myAfterReturning(String res){
System.out.println("==============后置通知===============");
System.out.println("这是个后置通知,获取的返回值是"+res);
//可以修改返回值
}
@AfterReturning(value="execution(* *..myStudent(..))",returning = "res")
public void myAfterReturning1(Student res){
System.out.println("==============对象后置通知===============");
System.out.println("这是个后置通知,获取的返回值是"+res);
//可以修改返回值
res.setName("傻大个");
}
3.环绕通知@Around
1.环绕通知是在函数执行前后,而不是里面执行的一些功能等同于@After和@Before配个使用
2.有一个参数ProceedingJoinPoint,用来是否执行函数的使用(执行方法proceed())
3.有返回类型,建议是object
4.使用过程
第一步:定义object类型
object result;
第二步:获取参数
Object args[]=ProceedingJoinPoint参数名.getArgs();
参数转换
resule=ProceedingJoinPoint参数名.proceed(参数··);
第三步:可以修改结果
直接result=XXX;
return result;
5.特点:是用来做事务的
4.异常处理@AfterThrowing
特点
格式
执行方式
5.最终通知@After
格式
6.切入点表达式@Pointcut
6.其他
<aop:aspectj-autoproxy proxy-target-class="true"/>