AspectJ 对 AOP 的实现

189 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解AspectJ 对 AOP 的实现,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

AspectJ 对 AOP 的实现

对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可以完成面向切面编程。 AspectJ 也实现了 AOP 的功能,且其实现方式更为简捷而且还支持注解式开发。所以,Spring 又将 AspectJ 的对于 AOP 的实现也引入到了自己的框架中。 在 Spring 中使用 AOP 开发时,一般使用 AspectJ 的实现方式

AspectJ 是一个优秀面向切面的框架,它扩展了 Java 语言,提供了强大的切面实现。

AspectJ的通知类型

 AspectJ 中常用的通知有5种类型:
     1.  前置通知
     2.  后置通知
     3.  环绕通知
     4.  异常通知
     5.  最终通知

AspectJ的切入点表达式

AspectJ 定义了专门的表达式用于指定切入点。 表达式的原型如下: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?) 说明: modifiers-pattern] 访问权限类型 ret-type-pattern 返回值类型 declaring-type-pattern 包名类名 name-pattern(param-pattern) 方法名(参数类型和参数个数) throws-pattern 抛出异常类型 ?表示可选的部分 以上表达式共 4 个部分。 execution(访问权限 方法返回值    方法声明(参数) 异常类型) 切入点表达式要匹配的对象就是目标方法的方法名。所以,execution 表达式中就是方法的签名。 PS:表达式中黑色文字表示可省略部分,各部分间用空格分开。在其中可以使用以下符号:

符号意义
*0-多个字符
..用在方法参数中,表示任意个参数;用在包名后,表示当前以及其子包路径
+用在雷鸣后,表示当前以及其子类;用在接口后,表示当前接口以及其实现类

示例: execution(* com.jinhaun.service. . (..)) 指定切入点为:定义在 service 包里的任意类的任意方法。 execution(* com.jinhaun.service.. . (..)) 指定切入点为:定义在 service 包或者子包里的任意类的任意方法。“..”出现在类名中时,后面必须跟 “ ”,表示包、子包下的所有类。 execution( com.jinhaun.service.IUserService+.*(..)) 指定切入点为:IUserService 若为接口,则为接口中的任意方法及其所有实现类中的任意方法;若为类,则为该类及其子类中的任意方法。