目录
切入点:决定额外方法加入的位置!
切入点的种类(使用的是execution):
1,方法切入点
定义login方法作为切入点 * login(..)。之间有空格 #注意,非java.lang包下的参数要写全称
若login方法由两个String类型的参数。 * login(String,String);
方法名全称 修饰符 包.类.方法(参数)
2,类切入点
指定类作为切入点(额外功能加入的位置)
指定类中的所有方法
* com.demo.UserServiceImpl.*(..);
所有包中相同的类作为切入点【忽略包】
* *.UserServiceImpl.*(..)【只有一级包】
* *..UserServiceImpl.*(..)【存在多级包】
3,包切入点【推荐】
价值更高;指定包作为额外功能加入的位置,自然包中所有类及其方法都会加入额外的类。
#切入点包中的所有类,必须在其一级包中,而不能在其子包中。
* *.包.类.方法名(..)
#当前包和子包都生效
* *.包..类.方法名(..)
切入点函数:用于执行切入点表达式
1,execution
最为重要的切入点函数,功能最全。
执行方法切入点表达式,类切入点表达式,包切入点表达式。
弊端:execution表达式执行切入点表达式书写麻烦。
例如:execution(* com.proxy..*.*(..))包切入点。
所以有了其他的切入点函数,目的是为了简化该切入点函数的书写复杂程度。
2,args
作用:主要用于指定方法参数类型【只指定参数类型】
execution(* *(string,string))表示两个参数都是string类型的方法切入点
args(string,string)直接表示参数是两个string类型。
3,within
作用:主要用于进行类、包类型类型的切入。【省略修饰符,方法以及参数】
class: exection(* *..UserServiceImpl.*(..)) == within(*..UserServiceImpl)
package:exection(* com.proxy..*.*(..)) == within(com.proxy..*)
4,annotation
作用:为具有特殊注解的方法加入额外功能
<aop:pointcut id="pc" expression="@annotation(注解location)"/>这个位置指你定义注解.Java文件的地址。
切入点函数的逻辑运算
指的是 整合多个切入点函数一个配合工作,进而完成更为复杂的功能。
and 与操作
案例:Proxy包中 同时 参数两个string。
within(com.proxy..*) and args(string,string)
注意:与操作不能作用于同种类型的切入点类型;因为同种方法不能同时满足,要用 or或操作。
or 或操作
例如给login和register作为方法切入点
1,以注解的形式完成
2,execution(* login(..)) or execution(* *register(..))【指的是所有叫这个名字的方法】