定义4个增强方法,获取目标方法的信息,返回值,异常对象
1.定义方法 - 增强代码
2.使用注解指定对应的位置
3.配置切点表达式选中方法
4.切面和ioc的配置
5.开启aspectj注解的支持
TODO:增强方法中获取目标方法信息
1.全部增强方法中,获取目标方法的信息(方法名,参数,访问修饰符,所属的类的信息...)
形参增加(JoinPoint joinPoint), 包:import org.aspectj.lang.JoinPoint;
joinPoint包含目标方法的信息
2.返回的结果 - @AfterReturning
形参增加 (Object result) 用result接收返回结果
注解中增加(returning = "result")
3.异常的信息 - @AfterThrowing
形参增加(Throwable throwable) 用throwable接收异常信息
注解中增加(throwing = "throwable")
TODO:切点表达式
固定语法execution(1.2.3.4.5(6))
1.访问修饰符
public / private ...
2.方法的返回值类型
String int void
注意:如果不考虑访问修饰符和返回值!这两位整合成一起写 *
如果要是不考虑,必须两个都不考虑! 不能出现 * String
3.包的位置
具体包:com.suchuanlin.service.impl
单层模糊:com.suchuanlin.service.* -> *表示service下的任意包
多层模糊:com..impl -> 任意层模糊
细节:..不能开头
找所有impl包:com..impl 或者 *..impl,不能写成..impl
4.类的名称
具体类:CalculatorImpl
模糊:*
部分模糊:*impl (以impl结尾的类)
5.方法名 语法和类名一致
6.(6)形参列表
没有参数:()
有具体参数:(String),(String int)
模糊参数:(..) -> 有没有参数都可以,有多个也可以
部分模糊:(String..) -> String后面有没有都无所谓
(..int) -> 最后一个参数是int
(String..int) -> 第一个参数是String,最后一个参数是int
TODO:实战
1.查询某包某类下,访问修饰符是公有,返回值是int的全部方法
public int com.suchuanlin.service.impl.*(..)
2.查询某包下类中第一个参数是String的方法
* suchuanlin.service.impl.*(Sting..)
3.查询全部包下,无参数的方法!
* *..*.*()
4.查询com包下,以int参数类型结尾的方法
* com..*(..int)
5.查询指定包下,Service开头类的私有返回值int的无参数方法
private int com.suchuanlin.service.impl.Service*.*()
package com.suchuanlin.advice;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.lang.reflect.Modifier;
/**
* 定义4个增强方法,获取目标方法的信息,返回值,异常对象
* 1.定义方法 - 增强代码
* 2.使用注解指定对应的位置
* 3.配置切点表达式选中方法
* 4.切面和ioc的配置
* 5.开启aspectj注解的支持
*
* TODO:增强方法中获取目标方法信息
* 1.全部增强方法中,获取目标方法的信息(方法名,参数,访问修饰符,所属的类的信息...)
* 形参增加(JoinPoint joinPoint), 包:import org.aspectj.lang.JoinPoint;
* joinPoint包含目标方法的信息
* 2.返回的结果 - @AfterReturning
* 形参增加 (Object result) 用result接收返回结果
* 注解中增加(returning = "result")
* 3.异常的信息 - @AfterThrowing
* 形参增加(Throwable throwable) 用throwable接收异常信息
* 注解中增加(throwing = "throwable")
*
* TODO:切点表达式
* 固定语法execution(1.2.3.4.5(6))
* 1.访问修饰符
* public / private ...
* 2.方法的返回值类型
* String int void
* 注意:如果不考虑访问修饰符和返回值!这两位整合成一起写 *
* 如果要是不考虑,必须两个都不考虑! 不能出现 * String
* 3.包的位置
* 具体包:com.suchuanlin.service.impl
* 单层模糊:com.suchuanlin.service.* -> *表示service下的任意包
* 多层模糊:com..impl -> 任意层模糊
* 细节:..不能开头
* 找所有impl包:com..impl 或者 *..impl,不能写成..impl
* 4.类的名称
* 具体类:CalculatorImpl
* 模糊:*
* 部分模糊:*impl (以impl结尾的类)
* 5.方法名 语法和类名一致
* 6.(6)形参列表
* 没有参数:()
* 有具体参数:(String),(String int)
* 模糊参数:(..) -> 有没有参数都可以,有多个也可以
* 部分模糊:(String..) -> String后面有没有都无所谓
* (..int) -> 最后一个参数是int
* (String..int) -> 第一个参数是String,最后一个参数是int
* TODO:实战
* 1.查询某包某类下,访问修饰符是公有,返回值是int的全部方法
* public int com.suchuanlin.service.impl.*(..)
* 2.查询某包下类中第一个参数是String的方法
* * suchuanlin.service.impl.*(Sting..)
* 3.查询全部包下,无参数的方法!
* * *..*.*()
* 4.查询com包下,以int参数类型结尾的方法
* * com..*(..int)
* 5.查询指定包下,Service开头类的私有返回值int的无参数方法
* private int com.suchuanlin.service.impl.Service*.*()
*/
@Component
@Aspect
public class MyAdvice {
@Before("execution(* com..impl.*.*(..))")
public void before(JoinPoint joinPoint){
//1.获取方法所属的类的信息
String simpleName = joinPoint.getTarget().getClass().getSimpleName();
//2.获取方法的修饰符
int modifiers = joinPoint.getSignature().getModifiers();
String string = Modifier.toString(modifiers);
//3.获取方法名
String name = joinPoint.getSignature().getName();
//4.获取参数列表
Object[] args = joinPoint.getArgs();
}
@AfterReturning(value = "execution(* com..impl.*.*(..))",returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result){}
@After("execution(* com..impl.*.*(..))")
public void after(JoinPoint joinPoint){}
@AfterThrowing(value = "execution(* com..impl.*.*(..))",throwing = "throwable")
public void afterThrowing(JoinPoint joinPoint, Throwable throwable){}
}