配置SpringAop时需要用到的AspectJ表达式

Aspectj切入点语法定义

在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点"

例如定义切入点表达式  execution (* com.sample.service.impl..*.*(..))

execution()是最常用的切点函数,其语法如下所示:

整个表达式可以分为五个部分:

1、execution(): 表达式主体。

2、第一个*号:表示返回类型,*号表示所有的类型。

3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。

4、第二个*号:表示类名,*号表示所有的类。

5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。

AspectJ的Execution表达式

execution()

execution()是最常用的切点函数,其语法如下所示:

execution(<修饰符模式>? <返回类型模式> <方法名模式>(<参数模式>) <异常模式>?)  除了返回类型模式、方法名模式和参数模式外,其它项都是可选的。与其直接讲解该方法的使用规则,还不如通过一个个具体的例子进行理解。下面,我们给出各种使用execution()函数实例。

1)通过方法签名定义切点

execution(public * *(..))l

匹配所有目标类的public方法,但不匹配SmartSeller和protected void showGoods()方法。第一个*代表返回类型,第二个*代表方法名,而..代表任意入参的方法;

execution(* *To(..))l

匹配目标类所有以To为后缀的方法。它匹配NaiveWaiter和NaughtyWaiter的greetTo()和serveTo()方法。第一个*代表返回类型,而*To代表任意以To为后缀的方法;

2)通过类定义切点

execution(* com.baobaotao.Waiter.*(..))l

匹配Waiter接口的所有方法,它匹配NaiveWaiter和NaughtyWaiter类的greetTo()和serveTo()方法。第一个*代表返回任意类型,com.baobaotao.Waiter.*代表Waiter接口中的所有方法;

execution(* com.baobaotao.Waiter+.*(..))l

匹 配Waiter接口及其所有实现类的方法,它不但匹配NaiveWaiter和NaughtyWaiter类的greetTo()和serveTo()这 两个Waiter接口定义的方法,同时还匹配NaiveWaiter#smile()和NaughtyWaiter#joke()这两个不在Waiter 接口中定义的方法。

3)通过类包定义切点

在类名模式串中,“.*”表示包下的所有类,而“..*”表示包、子孙包下的所有类。

execution(* com.baobaotao.*(..))l

匹配com.baobaotao包下所有类的所有方法;

execution(* com.baobaotao..*(..))l

匹 配com.baobaotao包、子孙包下所有类的所有方法,如com.baobaotao.dao,com.baobaotao.servier以及 com.baobaotao.dao.user包下的所有类的所有方法都匹配。“..”出现在类名中时,后面必须跟“*”,表示包、子孙包下的所有类;

execution(* com..*.*Dao.find*(..))l

匹配包名前缀为com的任何包下类名后缀为Dao的方法,方法名必须以find为前缀。如com.baobaotao.UserDao#findByUserId()、com.baobaotao.dao.ForumDao#findById()的方法都匹配切点。

4)通过方法入参定义切点

切点表达式中方法入参部分比较复杂,可以使用“*”和“ ..”通配符,其中“*”表示任意类型的参数,而“..”表示任意类型参数且参数个数不限。

execution(* joke(String,int)))l

匹 配joke(String,int)方法,且joke()方法的第一个入参是String,第二个入参是int。它匹配 NaughtyWaiter#joke(String,int)方法。如果方法中的入参类型是java.lang包下的类,可以直接使用类名,否则必须使用全限定类名,如joke(java.util.List,int);

execution(* joke(String,*)))l

匹 配目标类中的joke()方法,该方法第一个入参为String,第二个入参可以是任意类型,如joke(String s1,String s2)和joke(String s1,double d2)都匹配,但joke(String s1,double d2,String s3)则不匹配;

execution(* joke(String,..)))l

匹配目标类中的joke()方法,该方法第 一个入参为String,后面可以有任意个入参且入参类型不限,如joke(String s1)、joke(String s1,String s2)和joke(String s1,double d2,String s3)都匹配。

execution(* joke(Object+)))l

匹 配目标类中的joke()方法,方法拥有一个入参,且入参是Object类型或该类的子类。它匹配joke(String s1)和joke(Client c)。如果我们定义的切点是execution(* joke(Object)),则只匹配joke(Object object)而不匹配joke(String cc)或joke(Client c)。

时间: 2024-10-10 10:13:50

配置SpringAop时需要用到的AspectJ表达式的相关文章

基于Aspectj表达式配置的Spring AOP

AOP(Aspect-Oriented Programming, 面向切面编程):是一种新的方法论, 是对传统OOP(Object-Oriented Programming, 面向对象编程)的补充. 它其实就是将公共的东西收取出来进行处理,横向重复,纵向抽取.从而使得代码更简洁. 我的博客地址:https://www.cnblogs.com/themysteryofhackers/p/12013351.html 更新时间:2019-12-09 一.创建Maven项目 创建Maven项目的步骤和我

Lichee (六) 配置内核时的一点小优化

我们在分析<Lichee(二) 在sun4i_crane平台下的编译 >的时候,居然没有一个步骤是在配置内核 make ARCH=arm menuconfig 仔细的读过的代码的会发现,在build_kernel有这么一段话 if [ ! -e .config ]; then echo -e "\n\t\tUsing default config... ...!\n" cp arch/arm/configs/sun4i_crane_defconfig .config fi

配置openGL时遇到的一些问题

今天在配置openGL时遇到了一些问题,在各种"玩弄“后终于配置好了.(汗) 电脑为windows10(X64),原本是装好vs2015的,所以只需要下载一些头文件.OpenGL 下有一些重用的辅助库,比如glut,glew等等,在windows平台下需要自己安装,因为微软为了推广自己的DX,在windows下只支持openGL 1.1版本. 现在openGL已经发展到3.0了,因此我们需要自己下载配置这些库,在这里我们来安装glut, glee,  glew这三个库,以及一些OpenGL扩展支

Jenkins配置ssh时总是提示Can&#39;t connect to server

Jenkins配置ssh时总是提示Can't connect to server 我在本地windows系统中启动了一个Jenkins服务,进行配置ssh,链接到同一网段的服务器上Linux上. 总是连不上,Windows的防火墙和杀毒软件都关闭了. Jenkins配置ssh时总是提示Can't connect to server

Hibernate项目里配置环境时,jar包配置不当会对测试结果产生影响。

问题情况: 如下图所示,该图中,显示了一堆错误的jar包.这是导致了Junit4测试通过了,数据库却没反应的原因. 原因: 之所以出现这种情况,eclipse其实已经告诉了我们原因.如下图所示,这些jar包的入口消失了.换句话说就是项目无法使用这些jar包. 解决方法:把这些JAR包全部删掉,因为项目里已经有了所有的jar包.上面这些纯属多余,而且由于它们的存在,导致真正有用的JAR包不能本使用. 结果:新的数据录入了数据库. http://www.bycoder.cn/t/hibernate/

JPA配置实体时 insertable = false, updatable = false

当使用JPA配置实体时,如果有两个属性(一个是一般属性,一个是多对一的属性)映射到数据库的同一列,就会报错. 这时,在多对一的@JoinColumn注解中添加insertable = false, updatable = false就能解决. 例如:   /** * 用户类 */ @Entity @Table(name = "TBL_SYS_USER") public class SysUser{ @Id @GeneratedValue(generator = "system

在Eclipse中配置Tomcat时,出现Cannot create a server using the selected type错误

在eclipse中配置Tomcat时,出现Cannot create a server using the selected type错误 原因:Tomcat被删除或者是重新安装,并且安装目录改变了. 解决方法:在"Window->preferences->Server->Runtime Environment",编辑Tomcat的目录为你新安装的目录,然后保存,这样就可以建立Tomcat server了.

oracle emca 配置dbcontrol时,无法上传EM资料库配置解决方法

系统环境: windows server 2008 R2 Ent. 64bit 在用emca配置dbcontrol时,提示:"严重: 将配置数据上载到资料档案库时出错",经查是IPV6造成的.把网卡配置中的ipv6禁用掉仍然不行,后又查询资料得知需要修改drivers/etc/下的hosts文件. 故障现象: C:\Users\Administrator>emca -config dbcontrol db EMCA 开始于 2017-9-4 11:51:26 EM Configu

转!!配置Tomcat时server.xml和content.xml自动还原问题

原博文地址:http://www.cnblogs.com/zuosl/p/4342190.html 当我们在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml和content.xml文件. 但是当我们修改完后重启Tomcat服务器时发现xml文件又被还原了,修改无效果. 为什么会还原? Tomcat服务器在Eclipse中启动时,会自动发布Eclipse中部署的项目,但是我的项目是自己手动在外面部署的,Eclipse只认得在它里面部署的项目,因此它会创建一个新的serv