首先说一下这个AspectJ出现的原因,在AspectJ之前我们可以使用SpringAOP来实现功能如下图所示,但是我们也面临着一些缺陷,就是它注册代理组件、取出方法的指定并不那么灵活,而AspectJ在注册过程中不需要一一指定委托类组件,取出过程中也不需要指定组件id,接下来我们详细介绍下它的使用方法
目录
Pointcut
切入点是指指定增强的方法(必须是容器中的组件方法)
切入点的表达式需要在配置文件中配置
标签<aop:pointcut id expression/>,作为<aop:config>的子标签
切入点表达式
execution
execution(修饰符 返回值 包名、类名、方法名(形参))
判断方法(容器中的组件的方法)是否满足表达式,如果满足就增强
- 能否省略
- 能否通配
- 特殊用法
首先我们来介绍下使用规则
修饰符可以省略,代表任意修饰符;
返回值不能省略
返回值可以使用*作为通配符
JavaBean类要写全类名
包名、类名、方法名
可以部分省略,头和尾(头:包名的第一级、尾:方法名)不能省略,中间的任意一部分都可以省略。
使用..进行省略,可以使用通配符
形参
可以省略不写,省略不写代表的是无参方法
可以通配:
*👉单个任意类型的参数
.. 👉任意参数:数量上的任意、类型上的任意
JavaBean要写全类名
@annotation
使用自定义注解 指定增强的方法
在容器中的组件里,给哪一个方法增加上自定义的注解,哪一个方法就被增强
如果多个方法要被增强,没有什么特别的规律,没有办法使用execution这种写法,可以使用自定义注解这种写法
以上就是AspectJ的advisor方法的介绍,接下来我们使用一个案例熟悉下使用方法
案例:在应用程序中有几个方法比较特殊需要计算这几个方法的执行时间
首先是在maven工程中导入依赖
接下来搭建我们的业务,这里要注意,在需要增强的方法上加上自定义注解@CountTime
接下来是我们的自定义注解
接下来是我们的配置文件,这里需要我们自定义通知类(通知就是指导我们做增强的)
那么这个advisor实际上就是对容器中通过切入点指定的这些方法按照通知的方式去做增强,这也是AspectJ的主要形式
接下来我们写一个计算委托类执行时间的通知
测试类