AspectJ是一个面向切面编程的框架,使用AspectJ不需要改动Spring配置文件,就可以实现Spring AOP功能。本篇结合实际案例详细讲述使用AspectJ实现AOP功能。通过本篇的学习,可以解决如下问题。

● 使用AspectJ技术的背景是什么?

● 在不修改原有业务代码的情况下,如何设置业务拦截点?

1、 使用AspectJ技术的背景

在使用AspectJ之前,需要确定项目已经引入了AspectJ相关Jar包,并且AspectJ的版本要兼容JDK、Spring框架的版本,使用不兼容的版本会导致程序报错。

课程案例SpringProgram项目使用的JDK版本是1.8,Spring框架版本是5.08。需要引入的AspectJ相关Jar包如下所示。

● aspectj-1.8.9

● aspectjweaver-1.8.9

关于AOP实现原理在《详解Spring框架的AOP机制》一文中已经详细描述,这里不再赘述。不过本文的AOP项目案例还是借鉴《详解Spring框架的AOP机制》一文中的案例。因为Spring框架提供了AspectJ 注解方法和基于XML架构的方法来实现AOP,在《详解Spring框架的AOP机制》中,重点介绍了基于XML架构的方法来实现AOP,本文将重点介绍利用AspectJ 注解方法实现AOP。用同一个案例采用两种不同的实现方法,既可以加深对AOP的理解,也可以对两种实现技术进行对比,可以选择适合自己的一种技术来实现AOP。

在课程案例SpringProgram项目中,一个业务流程是校长通过邮件发送上课通知给老师。校长执行该业务时,业务系统并没有对老师进行验证。现在要求校长在发送通知之前,需要对老师进行用户验证。

具体要求是在尽量不改变原有业务代码的情况下,加入老师验证功能。原有业务代码如下。

分析上面的业务代码,可以考虑在执行setTeacher之前加入老师的验证方法,并将老师对象teacherZhang作为参数传给验证方法。如果能够修改业务代码,可以直接在setTeacher方法之前加入VerifyTeacher验证方法。

由于各种原因,不允许修改原有的业务代码。在这种情况下,可以采用AOP技术,拦截setTeacher方法,在setTeacher方法执行之前、执行之后、抛出异常之后执行拦截方法。拦截方法所在类的称为切面,拦截方法称为切入点。如下图所示。

图 1 使用AOP拦截setTeacher方法

2、使用Aspectj拦截setTeacher方法

AspectVerifyUser类用于验证老师身份,如果不加Aspecj注解,AspectVerifyUser类只是一个普通的Java类,不能被AOP调度使用。要使AspectVerifyUser类作为切面使用并拦截setTeacher方法,实现执行setTeacher方法之前先执行VerifyTeacher方法,在setTeacher方法执行成功后,再执行AfterSetTeacher方法。就需要在AspectVerifyUser类中添加Aspecj注解。

添加@Aspect注解

在类头部加@Aspect注解,使AspectVerifyUser类成为切面类,并被AOP识别和加载。作用类似于在Spring配置文件中的AOP标签<aop:config>。

添加 @Pointcut注解

在类方法头部加@Pointcut注解,使该方法称为一个切入点。@Pointcut注解的execution表达式定义该方法在什么位置切入。

例如:

@Pointcut注解指示AOP将VerifyUser()方法作为切入点,切入到AopEmailNotice类的setTeacher位置,传入的参数为任意类型和数量,VerifyUser()为空函数,实际执行的函数通过@Before、@After、@Around等注解与VerifyUser()方法关联。

再如:

@Pointcut注解指示AOP将VerifyUser()方法作为切入点,切入到com.milihua.springprogram.notice包及子包下所有的类及类中所有的方法。

又如:

@Pointcut注解指示AOP将VerifyUser()方法作为切入点,切入到com.milihua.springprogram.notice包下所有的类及类中所有的方法。

添加 @{ADVICE-NAME}注解

@{ADVICE-NAME}为声明建议注解,也可以称之为通知注解。该注解添加到实际执行函数的头部,并与切入点的名称进行关联。

@{ADVICE-NAME}有五种注解,分别是@Before、@After、@Around、@AfterReturning、@AfterThrowing。被@Before注解的方法在被切入方法执行之前执行;被@After注解的方法在被切入方法执行之后执行,不考虑是否执行成功;被@AfterReturning注解的方法在被切入方法执行成功之后执行,当被切入方法发生异常时,该方法不被执行;被@Around注解的方法在被切入方法执行之前和执行之后都执行;被@AfterThrowing注解的方法,只有当被切入方法执行过程发生异常时才会执行。

例如:

VerifyTeacher方法头部被@Before("VerifyUser()")注解,该方法在被切入的setTeacher方法之前执行。

获取通知参数

切入方法如何获取被切入方法传递过来的参数呢?例如,AspectVerifyUser类的VerifyTeacher方法切入到AopEmailNotice类的setTeacher方法,VerifyTeacher需要获取setTeacher方法的AopTeacher类参数,用于对老师进行用户验证。

AOP使用org.aspectj.lang.JoinPoint类型,用于获取被切入点传入的参数,任何切入方法的第一个参数都可以是JoinPoint。JoinPoint结构如下。

其中,getArgs方法可以获取被切入点方法参数列表,根据参数列表可以获取传入的参数。

在课程案例SpringProgram项目中,添加aspec.xml,配置AspectVerifyUser类。

在课程案例SpringProgram项目中,添加测试类。

课程小结

(1)本篇探讨了使用AspectJ技术的背景。当原有业务流程需要添加事务处理、安全控制、性能统计、异常处理等功能时,可以使用AspectJ技术在不修改原有业务代码的情况下,将上述功能切入到业务流程中;在构建新的系统时,也可以将上述功能独立考虑,再通过AspectJ技术将它们集成到系统中。

(2)本篇也通过案例讲述了应用AspectJ技术实现AOP的过程,具体实现步骤是:首先编写需要切入业务流程的独立模块(也称为切面)和切入点(模块中的方法),并添加AspectJ相关注解,确定切入的位置;然后在Spring配置文件中配置新添加的切面Bean,无需配置AOP信息;最后编写测试代码。

使用AspectJ注解技术实现AOP功能相关推荐

  1. uni中动态加载class_SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 AOP--面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强.按切面被织如到目标类中的时间划分,主要有以下几 ...

  2. (转)使用JDK中的Proxy技术实现AOP功能

    http://blog.csdn.net/yerenyuan_pku/article/details/52863780 AOP技术在企业开发中或多或少都会用到,但用的最多的大概就是做权限系统时,在做权 ...

  3. ITCAST视频-Spring学习笔记(使用JDK中的Proxy技术实现AOP功能)

    感谢ITCAST发布的免费视频. AOP-代理对象 1.  拦截所有业务方法 2.  判断用户是否有权限,由权限就允许它执行业务方法,没有权限不允许执行业务方法. 代理对象创建由两种:静态代理,动态代 ...

  4. Spring AOP编程-aspectJ注解开发

    1.编写目标 public interface ICustomerService {public void save();public void search();public int update( ...

  5. 第五章 Spring进阶-注解方式实现AOP(1)

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 徒弟:师傅,我 ...

  6. 采用Spring实现AOP功能

    1.AOP中的概念 Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面横切性关注点的抽象. joinpoint(连接点):所谓连接点是 ...

  7. aop注解配置切点 spring_使用注解匹配Spring Aop切点表达式

    Spring中的类基本都会标注解,所以使用注解匹配切点可以满足绝大部分需求 主要使用@within()/@target @annotaton() @args()等... 匹配@Service类中的所有 ...

  8. (转)使用CGLIB实现AOP功能与AOP概念解释

    http://blog.csdn.net/yerenyuan_pku/article/details/52864395 使用CGLIB实现AOP功能 在Java里面,我们要产生某个对象的代理对象,这个 ...

  9. Spring Aop实例之AspectJ注解配置

    上篇博文<Spring Aop实例之xml配置>中,讲解了xml配置方式,今天来说说AspectJ注解方式去配置spring aop. 依旧采用的jdk代理,接口和实现类代码请参考上篇博文 ...

最新文章

  1. 使用dd查看磁盘前4个扇区的内容
  2. jQuery 加法计算 使用+号即强转类型
  3. oracle10 exp imp 中文乱码
  4. C ++ 11基于反向范围的for循环
  5. 分布式锁三种实现方式(DB,redis,zookeeper)比较
  6. java 环境部署——java源码包的安装——java-rpm包的安装
  7. Android控件ActionBar浅析及适配2.x的方法介绍
  8. 「日常训练」Skills(Codeforce Round #339 Div.2 D)
  9. C#中使用DTS来导入数据及相关问题
  10. Why Not Specialize Function Templates?
  11. 在计算机中添加用户名和密码是多少,在win7系统中添加网络打印机提示输入用户名和密码的解决方案...
  12. 虎牙改名字服务器升级维护中,王一博“虎牙直播”被占id,无奈改了名字,新名字却被吐槽...
  13. 高等代数——大学高等代数课程创新教材(丘维声)——3.5笔记+习题
  14. [ProblemSolving]ut下载磁盘负荷过重
  15. 中石油 所罗门的宝藏
  16. QNX 7.1 交叉编译 cron
  17. 用mysql设计学籍管理系统_学生学籍管理系统(SQL数据库系统设计)(完整版).pdf...
  18. 微信证据以及数据恢复删除记录恢复交易恢复
  19. 083-我最爱的周杰伦几首歌
  20. Python库学习-Pandas

热门文章

  1. oracle 之 基础操作
  2. linux中使用lftp上传下载文件
  3. grep 和 sed:linux经常使用工具 amp; 基本正則表達式
  4. IIS虚拟目录实现与文件服务器网络驱动器映射共享
  5. Xcode怎样调整模拟器大小
  6. Windows服务器学习篇:服务器连接与退出
  7. ATL 线程池的使用
  8. linux shell sql赋值,Linux下shell执行SQL
  9. java this() super()_java中的this和super
  10. java 多个方法_java中的多个main()方法