分享知识 传递快乐
表达式类型
标准的Aspectj Aop的pointcut的表达式类型是很丰富的,但是Spring Aop只支持其中的9种,外加Spring Aop自己扩充的一种一共是10种类型的表达式,分别如下。
- execution:一般用于指定方法的执行,用的最多。
- within:指定某些类型的全部方法执行,也可用来指定一个包。
- this:Spring Aop是基于代理的,生成的bean也是一个代理对象,this就是这个代理对象,当这个对象可以转换为指定的类型时,对应的切入点就是它了,Spring Aop将生效。
- target:当被代理的对象可以转换为指定的类型时,对应的切入点就是它了,Spring Aop将生效。
- args:当执行的方法的参数是指定类型时生效。
- @target:当代理的目标对象上拥有指定的注解时生效。
- @args:当执行的方法参数类型上拥有指定的注解时生效。
- @within:与@target类似,看官方文档和网上的说法都是@within只需要目标对象的类或者父类上有指定的注解,则@within会生效,而@target则是必须是目标对象的类上有指定的注解。而根据笔者的测试这两者都是只要目标类或父类上有指定的注解即可。
- @annotation:当执行的方法上拥有指定的注解时生效。
- bean:当调用的方法是指定的bean的方法时生效。
execute介绍
execution是使用的最多的一种Pointcut表达式,表示某个方法的执行,其标准语法如下。
- modifiers-pattern:表示方法的访问类型,public等;
- ret-type-pattern:表示方法的返回值类型,如String表示返回类型是String,“*”表示所有的返回类型;
- declaring-type-pattern:表示方法的声明类,如“com.elim…*”表示com.elim包及其子包下面的所有类型;
- name-pattern:表示方法的名称,如“add*”表示所有以add开头的方法名;
- param-pattern:表示方法参数的类型,name-pattern(param-pattern)其实是一起的表示的方法集对应的参数类型,如“add()”表示不带参数的add方法,“add()”表示带一个任意类型的参数的add方法,“add(,String)”则表示带两个参数,且第二个参数是String类型的add方法;
- throws-pattern:表示异常类型;其中以问号结束的部分都是可以省略的
execute表达式结构解释如下
例: execution (* com.xh.service..*. *(..))
整个表达式可以分为五个部分:
1.execution():表达式主体。
2.第一个*号:表示返回类型, 号表示所有的类型。
3.包名:表示需要拦截的包名,后面的 “…” 表示当前包和当前包的所有子包,com.xh.service包、子孙包下所有类的方法。
4.第二个号:表示类名,号表示所有的类。
5.(…):最后这个星号表示方法名,*号表示所有的方法,括号表示方法的参数,两个句点表示任何参数类型。
execute使用示例
拦截任意公共方法
拦截以set开头的任意方法
拦截所有的不带参数的set()方法
拦截类或者接口中的方法
拦截UserService(类、接口)中定义的所有方法。
拦截包中定义的方法,不包含子包中的方法
拦截com.xh.service包中所有类中任意方法,不包含子包中的类。
拦截包或者子包中定义的方法
拦截com.xh.service包或者子包中定义的所有方法。
拦截所有com.xh包及其子包下所有类的以add开头的所有public方法
拦截任意公共方法的执行
拦截所有抛出Exception的方法
多个表达式之间使用
在多个表达式之间使用 or 表示 或,使用 and 表示 与;建议每个execution都被()包含起来,为了更好区分不同的表达式。
例如:
< aop:aspect>与< aop:advisor>的区别
< aop:aspect>:定义切面(切面包括通知和切点)
< aop:advisor>:定义通知器(通知器跟切面一样,也包括通知和切点)
< aop:aspect>定义切面时,只需要定义一般的bean就行,而定义< aop:advisor>中引用的通知时,通知必须实现Advice接口。
<aop:config proxy-target-class=“true” />
proxy-target-class=“true” 表示强制使用 CGLIB 技术来实现AOP,因为CGLIB是生成子类也就是代理类来实现的,所以proxy-target-class,表示是否代理目标类。<aop:config /> 就会由spring来选择,spring优先使用JDK动态代理来实现AOP。
————————————
如有不妥之处请留言指正。
相互学习,共同进步。