相信有不少同学和我一样,框架都是之前别人搭建好的,自己只是拿来按照之前的规则用。因此关于 AspectJ 的真正用法也是应了那句:懵逼树上懵逼果,懵逼树下你和我。所以下面将详细记录我是如何将一个只针对某个类的某个方法的增强,转换成针对多个类下的多个方法的增强的过程。
说明: AspectJ 语法表达式中,* 表示任意内容。
只针对 AccountServiceImpl 类下的参数为 Account 的 updateAccountByCardNo 方法增强。 <aop:pointcut id="pt1" expression="execution(public int com.idol.service.impl.AccountServiceImpl.updateAccountByCardNo(com.idol.pojo.Account))"/>解读:访问修饰符(可省略) + 返回值类型的全限定类名(可用 * 代替任意返回值类型。如果返回值为基本数据类型则不用写全限定类型。) + 全限定类名(可用 * 代替某一层级的包,也可用 *..* 代替任意多层级的的) + 方法名(可用 * 代替任意方法名,也可用 * 补全方法名表示以指定内容开头的方法名) + 参数类型的全限定类型(可用 * 表示任意参数,但参数数量最少为一个;也可用 .. 表示任意个数的任意类型参数)
例如:我想对 com.idol.service.impl 包下的所有对象中,以 update 开头的方法,进行增强。且不考虑返回值和参数类型。就可以写为: <aop:pointcut id="pt1" expression="execution(* com.idol.service.impl.*.update*(..))"/>源码中包含了纯注解模式和纯 xml 模式下的 AOP 的使用方式。
源码下载
------------------- 人前有多光鲜,人后就有多黯淡 -------------------