Aspect:所谓切面,面向的不是某一个对象的某一个方法,而是所有对象的某个方法,或者满足某些条件的对象的满足某些条件的方法,面向的不是点,而是面。
JoinPoint:切面内有很多的切点,可以表示为方法的开始和结束两端,可以用来在方法前后做一些处理,相当于在方法内前后都加了一些代码执行一些逻辑,但是具体不是这样实现的,而是用代理对象实现的。具体有2种方式:cglib和动态代理。
cglib:cglib是一个代码生成库,主要用于aop框架,拦截方法等操作。
cglib vs 动态代理:
1)cglib底层使用ASM框架,主要原理是操作字节码生成新的类。
2)动态代理只能代理接口,如果一个普通类没接口就没法代理。
3)动态代理提供Proxy类创建代理,cglib提供Enhancer类创建代理。
4)两者都可用于aop实现。
beforeAdvice/afterAdvice:方法开始的切点做的事情就叫beforeAdvice,方法结束的切点做的事情就叫afterAdvice。
Pointcut:类似于一种横切的动作,在程序中通常用注解@Pointcut表示,用来设置匹配切点的规则。spring也提供了一些简便的注解如@annotation等。
// 匹配所有public定义的方法
@Pointcut("execution(public * *(..))")
private void anyOperation(){}
// 匹配所有以set开始命名的方法
@Pointcut("execution(* set*(..))")
private void anyOperation1(){}
// 匹配对应包下的所有方法
@Pointcut("within(com.abc.def..)")
private void anyOperation2(){}
// 匹配带有注解com.abc.def.anno的所有方法
@Annotation("com.abc.def.anno")
private void anyOperation3(){}
网友评论