https://www.cnblogs.com/hejj-bk/p/11496505.html
ASM是一套JAVA字节码生成架构。它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。
重新生成或者在原来的class文件基础之上,直接添加日志处理的相关逻辑即可
切点:方法中可以插入代码的位置:(核心代码的)前面、(核心代码的)后面、异常后面、返回值后面
通知(advice):几个位置插入的代码叫做通知
切面:切面是通知和切点的结合,通知和切点共同定义了切面的全部内容。因为通知定义的是切面的
“要做什么”和”在何时做”,而切点定义的是切面的”在何地做”。将两者结合在一起,就可以完美的
展现切面在何时,何地,做什么(功能)。
横切关注点:对哪些方法进行拦截,
连接点:被拦截到的点,因spring只支持方法类型的连接点,所以spring连接点即为被拦截的方法,实际上还可以是字段或者是构造器
织入:将切面(切点和通知)应用于目标对象并创建代理对象的过程
InvocationHandler—>jdk动态代理
例子
@Aspect
public class TransactionDemo {
@Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))")
public void point(){
}
//法一
@Before(value="point()")
public void before(){
System.out.println("transaction begin");
}
//法二
public void before("execution(* com.yangxin.core.service.*.*.*(..))"){
System.out.println("transaction begin");
}
@AfterReturning(value = "point()")
public void after(){
System.out.println("transaction commit");
}
@Around("point()")
public void around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("transaction begin");
joinPoint.proceed();
System.out.println("transaction commit");
}
}