0


通过计算器案例进行springAop的通知类的联系

以下是使用IntelliJ IDEA 2021创建名为

SpringAopDemo

的Maven项目结构,基于JDK 1.8,并利用Spring AOP(Spring 5.2.10版本)实现计算器功能以及添加各种通知的详细步骤:

一、创建Maven项目

  1. 打开IntelliJ IDEA 2021:启动IntelliJ IDEA开发工具。
  2. 新建项目:点击File -> New -> Project,在弹出的窗口中选择Maven项目类型,然后点击Next
  3. 配置项目基本信息: - GroupId:可以自行定义,例如com.example。- ArtifactId:填写SpringAopDemo,与项目名称保持一致。- Version:设定项目版本号,如1.0-SNAPSHOT。- Project SDK:选择JDK 1.8版本(需提前安装并配置好JDK 1.8)。- 点击Next,选择项目的存储路径,点击Finish完成项目的创建。

二、添加Spring相关依赖到

pom.xml

文件

在项目的

pom.xml

文件中添加以下依赖(使用Spring 5.2.10版本):

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>SpringAopDemo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- Spring核心依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10</version></dependency><!-- Spring AOP依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.2.10</version></dependency><!-- AspectJ相关依赖,用于支持AOP的实现 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency></dependencies></project>

保存

pom.xml

文件后,Maven会自动下载相关依赖到本地仓库(前提是网络和配置正常)。

三、创建项目结构及相关类

  1. 创建包结构: 在src/main/java目录下创建项目的包结构,例如com.example.springaopdemo(根据实际的GroupId等情况确定),后续的类将放在对应的包下。
  2. 创建计算器接口及实现类:- 在com.example.springaopdemo包下创建Calculator接口,定义加法和除法的方法,代码示例如下:
packagecom.example.springaopdemo;publicinterfaceCalculator{intadd(int num1,int num2);doubledivide(int num1,int num2);}
- 在相同包下创建`CalculatorImpl`类实现`Calculator`接口,代码如下:
packagecom.example.springaopdemo;publicclassCalculatorImplimplementsCalculator{@Overridepublicintadd(int num1,int num2){return num1 + num2;}@Overridepublicdoubledivide(int num1,int num2){if(num2 ==0){thrownewIllegalArgumentException("除数不能为0");}return(double) num1 / num2;}}
  1. 创建通知类(切面类): 在com.example.springaopdemo包下创建CalculatorAspect类作为切面类,用于定义各种通知,代码示例如下:
packagecom.example.springaopdemo;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.annotation.*;importorg.springframework.stereotype.Component;importjava.util.Arrays;@Aspect@ComponentpublicclassCalculatorAspect{// 前置通知,在目标方法执行前输出参数信息@Before("execution(* com.example.springaopdemo.Calculator.*(..))")publicvoidbeforeMethod(JoinPoint joinPoint){String methodName = joinPoint.getSignature().getName();Object[] args = joinPoint.getArgs();System.out.println("计算数据为:"+Arrays.toString(args)+",方法:"+ methodName);}// 后置通知,在目标方法执行后输出提示信息@After("execution(* com.example.springaopdemo.Calculator.*(..))")publicvoidafterMethod(JoinPoint joinPoint){System.out.println("计算完毕!");}// 返回通知,在目标方法正常返回后输出计算结果@AfterReturning(pointcut ="execution(* com.example.springaopdemo.Calculator.*(..))", returning ="result")publicvoidafterReturning(JoinPoint joinPoint,Object result){System.out.println("计算结果是:"+ result);}// 异常通知,在目标方法抛出异常时输出异常信息@AfterThrowing(pointcut ="execution(* com.example.springaopdemo.Calculator.*(..))", throwing ="e")publicvoidafterThrowing(JoinPoint joinPoint,Exception e){System.out.println("计算异常为:"+ e.getMessage());}}

这里使用了AspectJ的注解来定义切面以及各种通知,

@Before

表示前置通知,

@After

表示后置通知,

@AfterReturning

表示返回通知,

@AfterThrowing

表示异常通知。通过

JoinPoint

可以获取到目标方法的相关信息,如方法名、参数等。

四、配置Spring配置文件(

applicationContext.xml

src/main/resources

目录下创建

applicationContext.xml

文件,用于配置Spring容器以及AOP相关设置,示例内容如下:

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 注册计算器实现类 --><beanid="calculator"class="com.example.springaopdemo.CalculatorImpl"/><!-- 注册切面类 --><beanid="calculatorAspect"class="com.example.springaopdemo.CalculatorAspect"/><!-- 配置AOP --><aop:config><aop:aspectref="calculatorAspect"><aop:pointcutid="calculatorPointcut"expression="execution(* com.example.springaopdemo.Calculator.*(..))"/><aop:beforepointcut-ref="calculatorPointcut"method="beforeMethod"/><aop:afterpointcut-ref="calculatorPointcut"method="afterMethod"/><aop:after-returningpointcut-ref="calculatorPointcut"returning="result"method="afterReturning"/><aop:after-throwingpointcut-ref="calculatorPointcut"throwing="e"method="afterThrowing"/></aop:aspect></aop:config></beans>

上述配置文件中,首先注册了

CalculatorImpl

CalculatorAspect

这两个Bean,然后通过

<aop:config>

标签配置了AOP相关的内容,定义了切点以及各个通知对应的方法调用关系。

五、编写测试类进行功能验证

src/test/java

目录下创建测试类(例如

SpringAopDemoTest

),代码示例如下(使用JUnit进行测试,需要添加JUnit依赖到

pom.xml

,此处省略添加依赖步骤):

packagecom.example.springaopdemo;importorg.junit.jupiter.api.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importstaticorg.junit.jupiter.api.Assertions.*;publicclassSpringAopDemoTest{@TestpublicvoidtestAdd(){ApplicationContext context =newClassPathXmlApplicationContext("applicationContext.xml");Calculator calculator =(Calculator) context.getBean("calculator");int result = calculator.add(3,5);assertEquals(8, result);}@TestpublicvoidtestDivide(){ApplicationContext context =newClassPathXmlApplicationContext("applicationContext.xml");Calculator calculator =(Calculator) context.getBean("calculator");double result = calculator.divide(6,2);assertEquals(3.0, result);}@TestpublicvoidtestDivideByZero(){ApplicationContext context =newClassPathXmlApplicationContext("applicationContext.xml");Calculator calculator =(Calculator) context.getBean("calculator");try{
            calculator.divide(6,0);fail("应该抛出异常");}catch(IllegalArgumentException e){assertEquals("除数不能为0", e.getMessage());}}}

上述测试类中的各个测试方法分别对加法、正常除法以及除数为0的除法情况进行了测试,通过Spring容器获取

Calculator

的实例来调用相应方法,同时验证了各种情况下切面中的通知是否能正确执行,比如前置通知输出参数、后置通知提示计算完毕、返回通知输出正确结果以及异常通知在出现异常时输出异常信息等情况。

通过以上完整的步骤,就完成了基于Spring AOP(Spring 5.2.10版本)的计算器功能以及相关通知的实现,在实际应用中还可以根据具体需求进一步扩展和优化AOP的使用场景及功能。

标签: java spring

本文转载自: https://blog.csdn.net/gannimeiwent/article/details/143840193
版权归原作者 Java ing 小杨 所有, 如有侵权,请联系我们删除。

“通过计算器案例进行springAop的通知类的联系”的评论:

还没有评论