热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

详解SpringAop实例之AspectJ注解配置

上篇《Spring Aop实例之xml配置》中,讲解了xml配置方式,今天来说说AspectJ注解方式去配置spring aop。 依旧采

上篇《Spring Aop实例之xml配置》中,讲解了xml配置方式,今天来说说AspectJ注解方式去配置spring aop。

依旧采用的jdk代理,接口和实现类代码请参考上篇博文。主要是将Aspect类分享一下:

package com.tgb.aop; 
 
import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.AfterReturning; 
import org.aspectj.lang.annotation.AfterThrowing; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.DeclareParents; 
import org.aspectj.lang.annotation.Pointcut; 
 
/** 
 * 测试after,before,around,throwing,returning Advice. 
 * @author Admin 
 * 
 */ 
@Aspect 
public class AspceJAdvice { 
 
 /** 
  * Pointcut 
  * 定义Pointcut,Pointcut的名称为aspectjMethod(),此方法没有返回值和参数 
  * 该方法就是一个标识,不进行调用 
  */ 
 @Pointcut("execution(* find*(..))") 
 private void aspectjMethod(){}; 
  
 /** 
  * Before 
  * 在核心业务执行前执行,不能阻止核心业务的调用。 
  * @param joinPoint 
  */ 
 @Before("aspectjMethod()") 
 public void beforeAdvice(JoinPoint joinPoint) { 
  System.out.println("-----beforeAdvice().invoke-----"); 
  System.out.println(" 此处意在执行核心业务逻辑前,做一些安全性的判断等等"); 
  System.out.println(" 可通过joinPoint来获取所需要的内容"); 
  System.out.println("-----End of beforeAdvice()------"); 
 } 
  
 /** 
  * After 
  * 核心业务逻辑退出后(包括正常执行结束和异常退出),执行此Advice 
  * @param joinPoint 
  */ 
 @After(value = "aspectjMethod()") 
 public void afterAdvice(JoinPoint joinPoint) { 
  System.out.println("-----afterAdvice().invoke-----"); 
  System.out.println(" 此处意在执行核心业务逻辑之后,做一些日志记录操作等等"); 
  System.out.println(" 可通过joinPoint来获取所需要的内容"); 
  System.out.println("-----End of afterAdvice()------"); 
 } 
 
 /** 
  * Around 
  * 手动控制调用核心业务逻辑,以及调用前和调用后的处理, 
  * 
  * 注意:当核心业务抛异常后,立即退出,转向AfterAdvice 
  * 执行完AfterAdvice,再转到ThrowingAdvice 
  * @param pjp 
  * @return 
  * @throws Throwable 
  */ 
 @Around(value = "aspectjMethod()") 
 public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable { 
  System.out.println("-----aroundAdvice().invoke-----"); 
  System.out.println(" 此处可以做类似于Before Advice的事情"); 
   
  //调用核心逻辑 
  Object retVal = pjp.proceed(); 
  System.out.println(" 此处可以做类似于After Advice的事情"); 
  System.out.println("-----End of aroundAdvice()------"); 
  return retVal; 
 } 
  
 /** 
  * AfterReturning 
  * 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行此Advice 
  * @param joinPoint 
  */ 
 @AfterReturning(value = "aspectjMethod()", returning = "retVal") 
 public void afterReturningAdvice(JoinPoint joinPoint, String retVal) { 
  System.out.println("-----afterReturningAdvice().invoke-----"); 
  System.out.println("Return Value: " + retVal); 
  System.out.println(" 此处可以对返回值做进一步处理"); 
  System.out.println(" 可通过joinPoint来获取所需要的内容"); 
  System.out.println("-----End of afterReturningAdvice()------"); 
 } 
  
 /** 
  * 核心业务逻辑调用异常退出后,执行此Advice,处理错误信息 
  * 
  * 注意:执行顺序在Around Advice之后 
  * @param joinPoint 
  * @param ex 
  */ 
 @AfterThrowing(value = "aspectjMethod()", throwing = "ex") 
 public void afterThrowingAdvice(JoinPoint joinPoint, Exception ex) { 
  System.out.println("-----afterThrowingAdvice().invoke-----"); 
  System.out.println(" 错误信息:"+ex.getMessage()); 
  System.out.println(" 此处意在执行核心业务逻辑出错时,捕获异常,并可做一些日志记录操作等等"); 
  System.out.println(" 可通过joinPoint来获取所需要的内容"); 
  System.out.println("-----End of afterThrowingAdvice()------"); 
 } 
} 

application-config.xml中,只需要配置业务逻辑bean和Aspect bean,并启用Aspect注解即可:

<&#63;xml version="1.0" encoding="UTF-8"&#63;> 
 
 
    
    
     
  
  
  
  
 

 结果如图:

通过测试的发现AroundAdvice、BeforeAdvice、AfterAdvice、ReturningAdvice的执行顺序是根据注解的顺序而定的。但是有时候修改了顺序,结果却没有变化,可能是缓存的缘故。前几天我也遇到了这样的问题,不过今天再测试了一下,发现执行顺序又跟注解的顺序一致了。

 xml 和 Annotation 注解都可以作为配置项,对Spring AoP进行配置管理,那么它们各自都有什么优缺点呢?

首先说说 xml 。目前 web 应用中几乎都使用 xml 作为配置项,例如我们常用的框架 Struts、Spring、hibernate 等等都采用 xml 作为配置。xml 之所以这么流行,是因为它的很多优点是其它技术的配置所无法替代的:

  1. xml 作为可扩展标记语言最大的优势在于开发者能够为软件量身定制适用的标记,使代码更加通俗易懂。
  2. 利用 xml 配置能使软件更具扩展性。例如 Spring 将 class 间的依赖配置在 xml 中,最大限度地提升应用的可扩展性。
  3. 具有成熟的验证机制确保程序正确性。利用 Schema 或 DTD 可以对 xml 的正确性进行验证,避免了非法的配置导致应用程序出错。
  4. 修改配置而无需变动现有程序。

虽然有如此多的好处,但毕竟没有什么万能的东西,xml 也有自身的缺点。

  1. 需要解析工具或类库的支持。
  2. 解析 xml 势必会影响应用程序性能,占用系统资源。
  3. 配置文件过多导致管理变得困难。
  4. 编译期无法对其配置项的正确性进行验证,或要查错只能在运行期。
  5. IDE 无法验证配置项的正确性无能为力。
  6. 查错变得困难。往往配置的一个手误导致莫名其妙的错误。
  7. 开发人员不得不同时维护代码和配置文件,开发效率变得低下。
  8. 配置项与代码间存在潜规则。改变了任何一方都有可能影响另外一方。

让我们来看看 Annotation 的优点。

  1. 保存在 class 文件中,降低维护成本。
  2. 无需工具支持,无需解析。
  3. 编译期即可验证正确性,查错变得容易。
  4. 提升开发效率。

同样 Annotation 也不是万能的,它也有很多缺点。

  1. 若要对配置项进行修改,不得不修改 Java 文件,重新编译打包应用。
  2. 配置项编码在 Java 文件中,可扩展性差。

总结:没有一个事物是万能的,同样 xml 和 Java Annotation 都有各自的优缺点。通过以上对比,细心的读者可能已经发现它们的优缺点恰恰是互补的。xml 的强项是 Annotation 所不具备的,而 Annotation 的优势也是 xml 所欠缺的。这也正是时下流行的 xml + Annotation 配置的原因所在。平衡才是王道呀!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Parallels Desktop 10 是一款功能强大的虚拟化软件,专为 Mac 用户设计,使其能够无缝运行 Windows 应用程序。该软件不仅显著提升了图形应用的性能,还优化了演示效果。对于需要在 Mac 上高效运行 Windows 程序的用户来说,Parallels Desktop 10 是一个理想的选择。本文将介绍如何获取其激活码及免费下载渠道,帮助用户轻松激活并使用这一强大工具。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • Git命令基础应用指南
    本指南详细介绍了Git命令的基础应用,包括如何使用`git clone`从远程服务器克隆仓库(例如:`git clone [url/path/repository]`)以及如何克隆本地仓库(例如:`git clone [local/path/repository]`)。此外,还提供了常见的Git操作技巧,帮助开发者高效管理代码版本。 ... [详细]
  • B站服务器故障影响豆瓣评分?别担心,阿里巴巴架构师分享预防策略与技术方案
    13日晚上,在视频观看高峰时段,B站出现了服务器故障,引发网友在各大平台上的广泛吐槽。这一事件导致了连锁反应,大量用户纷纷涌入A站、豆瓣和晋江等平台,给这些网站带来了突如其来的流量压力。为了防止类似问题的发生,阿里巴巴架构师分享了一系列预防策略和技术方案,包括负载均衡、弹性伸缩和容灾备份等措施,以确保系统的稳定性和可靠性。 ... [详细]
  • 在使用USB接口的二维条码扫描器时,发现其无法正确识别条码中的中文字符。然而,采用串口连接的方式则能够成功识别。目前面临的问题是如何将通过串口获取的数据在网页中进行实时展示,希望各位专家能提供解决方案,不胜感激。 ... [详细]
  • Win10 S系统与Chrome浏览器兼容性问题分析
    2017年5月2日,微软在美国推出了最新的Windows 10 S操作系统,专为教育领域设计,旨在为教师和学生提供一系列高效的产品和服务。该系统的最大特点是其简洁的设计和快速的响应速度,然而在与某些应用的兼容性方面,特别是Chrome浏览器,仍存在一些问题。本文将深入分析这些兼容性问题,并探讨可能的解决方案。 ... [详细]
  • Android UI设计:提升用户界面体验的关键要素
    在今年的谷歌I/O开发者大会上,北京时间5月19日凌晨1点,谷歌正式推出了Android 12 Beta 1系统,并公布了参与该版本开发者Beta测试计划的手机品牌。此次发布标志着Android 12在用户体验和界面设计上的重大改进,为开发者提供了更多创新工具和资源,以进一步提升用户的交互体验。 ... [详细]
  • NFT市场热度持续攀升,波卡能否抓住机遇迎来NFT夏季热潮?
    NFT市场热度持续攀升,波卡能否抓住机遇迎来NFT夏季热潮? ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • 本文深入探讨了如何选择适合业务需求的MySQL存储引擎,详细解析了不同存储引擎的特点、适用场景及其在数据存储和管理中的优势。通过对比InnoDB、MyISAM等主流引擎,为读者提供了全面的技术指导和专业建议,帮助开发者在实际应用中做出明智的选择。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
author-avatar
chnger
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有