上篇博文【SSH进阶之路】Spring的AOP逐层深入——AOP的基本原理(六),我们介绍了AOP的基本原理,以及5种通知的类型,
AOP的两种配置方式:XML配置和Aspectj注解方式。
这篇我们使用注解方式来实现一个AOP,我们先看一下项目的目录。
我们采用的是JDK代理,所以首先将接口和实现类代码附上:
package com.tgb.spring; public interface UserManager { public void addUser(String userName,String password); public void delUser(int userId); public String findUserById(int userId); public void modifyUser(int userId,String userName,String password); }
package com.tgb.spring; public class UserManagerImpl implements UserManager { @Override public void addUser(String userName, String password) { System.out.println("----UserManagerImpl.add()----"); } @Override public void delUser(int userId) { System.out.println("----UserManagerImpl.delUser()----"); } @Override public String findUserById(int userId) { System.out.println("----UserManagerImpl.findUserById()----"); if(userId <= 0){ throw new IllegalArgumentException("该用户不存在"); } return "jiuqiyuliang"; } @Override public void modifyUser(int userId, String userName, String password) { System.out.println("----UserManagerImpl.modifyUser()----"); } }
上面代码跟我们平时写的一样,关键看我们的切面类,同理,切面类可以换成安全性检测以及日志管理等等:
package com.tgb.spring; 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.Pointcut; @Aspect public class AspectJAdvice { /** * Pointcut * 定义Pointcut,Pointcut的名称为aspectjMethod(),此方法没有返回值和参数 * 该方法就是一个标识,不进行调用 */ @Pointcut("execution(* find*(..))") private void aspectjMethod(){}; /** * Before * 在核心业务执行前执行,不能阻止核心业务的调用。 * @param joinPoint */ @Before("aspectjMethod()") public void doBefore(JoinPoint joinPoint) { System.out.println("-----doBefore.invoke-----"); System.out.println(" 此处意在执行核心业务逻辑前,做一些安全性的判断等等"); System.out.println(" 可通过joinPoint来获取所需要的内容"); System.out.println("-----End of doBefore()------"); } /** * Around * 手动控制调用核心业务逻辑,以及调用前和调用后的处理, * * 注意:当核心业务抛异常后,立即退出,转向AfterAdvice * 执行完AfterAdvice,再转到ThrowingAdvice * @param pjp * @return * @throws Throwable */ @Around(value = "aspectjMethod()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { System.out.println("-----doAround.invoke-----"); System.out.println(" 此处可以做类似于Before的事情"); //调用核心逻辑 Object retVal = pjp.proceed(); System.out.println(" 此处可以做类似于After的事情"); System.out.println("-----End of doAround()------"); return retVal; } /** * After * 核心业务逻辑退出后(包括正常执行结束和异常退出),执行此Advice * @param joinPoint */ @After(value = "aspectjMethod()") public void doAfter(JoinPoint joinPoint) { System.out.println("-----doAfter.invoke-----"); System.out.println(" 此处意在执行核心业务逻辑之后,做一些日志记录操作等等"); System.out.println(" 可通过joinPoint来获取所需要的内容"); System.out.println("-----End of doAfter()------"); } /** * AfterReturning * 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行此Advice * @param joinPoint */ @AfterReturning(value = "aspectjMethod()", returning = "retVal") public void doReturn(JoinPoint joinPoint, String retVal) { System.out.println("-----doReturn().invoke-----"); System.out.println("Return Value: " + retVal); System.out.println(" 此处可以对返回值做进一步处理"); System.out.println(" 可通过joinPoint来获取所需要的内容"); System.out.println("-----End of doReturn()------"); } /** * 核心业务逻辑调用异常退出后,执行此Advice,处理错误信息 * * 注意:执行顺序在Around Advice之后 * @param joinPoint * @param ex */ @AfterThrowing(value = "aspectjMethod()", throwing = "ex") public void doThrowing(JoinPoint joinPoint, Exception ex) { System.out.println("-----doThrowing().invoke-----"); System.out.println(" 错误信息:"+ex.getMessage()); System.out.println(" 此处意在执行核心业务逻辑出错时,捕获异常,并可做一些日志记录操作等等"); System.out.println(" 可通过joinPoint来获取所需要的内容"); System.out.println("-----End of doThrowing()------"); } }
我们配置完切面类之后,还需要将Spring的IOC和AOP结合:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd"> <!-- 启用Spring对基于@AspectJ aspects的配置支持 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> <bean id="userManager" class="com.tgb.spring.UserManagerImpl"></bean> <bean id="aspectJAdvice" class="com.tgb.spring.AspectJAdvice"></bean> </beans>
所有都完成之后,最重要的一步就是编写客户端,进行测试,看是否和我们预想的结果一致。
package com.tgb.spring; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Client { public static void main(String[] args) { BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); UserManager userManager = (UserManager) factory.getBean("userManager"); //可以查找张三 userManager.findUserById(1); System.out.println("=====我==是==分==割==线====="); try { // 查不到数据,会抛异常,异常会被AfterThrowingAdvice捕获 userManager.findUserById(0); } catch (IllegalArgumentException e) { } } }
运行结果如图:
正常运行,无异常抛出(一)不正常运行,有异常抛出(二)
上面两张图的目的为了给大家描述Advice五种类型的运行顺序,让大家对他们有一个更加清晰的认识。
使用注解方式可以很好的帮助我们理解AOP的原理,如果对AOP的原理不是特别清晰,可以看一下上篇博文的图。下面我们采用xml方式再实现一遍AOP。
相关推荐
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用
SSH2 登录与 Spring AOP 拦截是两种在 IT 领域中常见的技术,主要用于提升系统安全性和管理效率。SSH2(Secure Shell version 2)是一种网络协议,用于提供安全的远程登录和数据传输,而 Spring AOP(Aspect ...
《Java进阶之Spring AOP源码深度剖析》是一份深度探讨Spring AOP技术的资料,共计17页。这份文档旨在帮助Java开发者更深入地理解Spring AOP的原理和实现,从而提升在实际开发中的应用能力。Spring AOP作为Spring框架...
在本主题中,我们将深入探讨Spring AOP的注解版,它是基于Java注解的实现,简化了配置并提高了代码的可读性。 首先,让我们理解AOP的基本概念。AOP是一种编程范式,允许程序员定义“切面”,这些切面封装了跨越多个...
本资料"Java进阶之SpringAOP应用共16页.pdf"深入探讨了Spring AOP在实际开发中的应用和实现原理,旨在提升Java开发者的技能水平。 首先,理解AOP的基本概念至关重要。AOP是一种编程范式,它将关注点分离为不同的...
本篇文章将深入探讨如何通过Spring的注解方式实现AOP的细节。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切点(Pointcut)定义了哪些方法会被通知(Advice...
在深入理解 Spring AOP 的源码时,需要熟悉 Spring IoC 的工作原理,以及 AOP 相关的概念,如切点表达式、通知类型等。了解这些基础知识可以帮助我们更好地掌握 Spring AOP 的实现细节。在分析源码时,可以参考作者...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦。在Spring框架中,AOP主要...
本篇主要探讨的是如何利用Spring AOP的注解来实现这些功能,包括前置通知、后置通知、返回通知和异常通知。 ### 前置通知(Before通知) 前置通知在目标方法执行之前运行。在Spring AOP中,我们使用`@Before`注解...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、性能监控等,而无需侵入业务代码。下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### ...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是...在`myaop`项目中,你可以找到具体的示例代码,包括切面类、切入点表达式以及相应的注解使用,通过这些示例可以更深入地理解Spring AOP的注解配置。
Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、性能监控等。在Spring AOP中,我们可以通过定义切面(Aspect...
通过理解并实践这个 Spring AOP 注解的例子,你可以更深入地了解如何在实际项目中使用 AOP 来提升代码的可维护性和复用性。无论是日志记录、性能监控还是事务管理,AOP 都能帮助我们编写更加整洁、模块化的代码。
本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁、高效的代码编写。 首先,我们来看注解在Spring AOP中的应用。在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,...
在Spring AOP中,我们无需深入到每个方法的实现细节,而是可以定义“切面”,在合适的时机(如方法调用前、后、异常发生时等)执行特定的逻辑。这样,业务代码和关注点(如日志、事务管理等)得以分离,提高了代码的...
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...