Spring AOP—基于XML的AOP实现(IDEA2026+JDK17)

0.环境

IDEA2026.1

JDK17

spring: 5.3.20

1.创建项目

打开IDEA,点击文件—>新建—>项目

然后,下面选择”Java“,名称为:SpringAOPXml,构建系统选:Maven,JDK版本选17。

最后点击”创建“。

创建完后,项目基本结构如下:

然后,我们给项目创建项目结构。

右击main下面的java文件夹,然后选择”新建“,再点击”软件包“

软件包命参考如下:com.guo.aop,可以根据实际情况修改包名。

创建完后,项目结构如下:

如果你是下面这种结构,想展开的话,那么继续往下看。 在项目上面,有三个点,点击,然后,选择”外观“,保证”压缩空的中间软件包“前面没有对号。

2.引入依赖

打开pom.xml文件,引入下面的依赖文件(把dependencies全部内容放进去)

<?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.0modelVersion><groupId>com.demogroupId><artifactId>SpringAOPXmlartifactId><version>1.0-SNAPSHOTversion><properties><maven.compiler.source>17maven.compiler.source><maven.compiler.target>17maven.compiler.target><project.build.sourceEncoding>UTF-8project.build.sourceEncoding>properties><dependencies><dependency><groupId>org.springframeworkgroupId><artifactId>spring-coreartifactId><version>5.3.20version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-beansartifactId><version>5.3.20version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-contextartifactId><version>5.3.20version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-expressionartifactId><version>5.3.20version>dependency><dependency><groupId>commons-logginggroupId><artifactId>commons-loggingartifactId><version>1.2version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-aopartifactId><version>5.3.20version>dependency><dependency><groupId>org.aspectjgroupId><artifactId>aspectjrtartifactId><version>1.9.7version>dependency><dependency><groupId>org.aspectjgroupId><artifactId>aspectjweaverartifactId><version>1.9.7version>dependency>dependencies>project>

一开始,引入报错是正常的,因为还没有下载下依赖,我们有两种方式。

方式1:直接点击右上角的刷新。

方法2:先点击右侧的maven插件,再点击上面的两个刷新。

注意:你先要配置正确maven环境,这里才能正常下载下来的依赖。

3.创建Dao文件

xxxDao是接口文件(也可以使用包来包裹这个文件)

右击aop文件夹,选择”新建“,然后选择”Java类“。

这个地方的类型要选:接口

接口名为:UserDao

添加代码:

packagecom.guo.aop;publicinterfaceUserDao{publicvoidinsert();publicvoiddelete();publicvoidupdate();publicvoidselect();}

添加完后项目如下:

4.创建Impl文件

xxxImpl文件是xxxDao具体实现类,这里面要写具体的业务代码。

右击aop文件夹,选择”新建“,再选择“Java类”

这里的选择的类型是:类

类名为:UserDaoImpl

参考代码:

packagecom.guo.aop;publicclassUserDaoImplimplementsUserDao{publicvoidinsert(){System.out.println("添加用户信息");}publicvoiddelete(){System.out.println("删除用户信息");}publicvoidupdate(){System.out.println("更新用户信息");}publicvoidselect(){System.out.println("查询用户信息");}}

注意,这里使用implements 实现了UserDao的接口,实现后的项目如下:

5.创建切面类

这个就是需要切进去的代码。

右击aop文件夹,选择“新建”,然后点击“Java类”

切面类名为:XmlAdvice 参考代码:

packagecom.guo.aop;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.ProceedingJoinPoint;publicclassXmlAdvice{//前置通知publicvoidbefore(JoinPointjoinPoint){System.out.print("这是前置通知!");System.out.print("目标类是:"+joinPoint.getTarget());System.out.println(",被织入增强处理的目标方法为:"+joinPoint.getSignature().getName());}//返回通知publicvoidafterReturning(JoinPointjoinPoint){System.out.print("这是返回通知(方法不出现异常时调用)!");System.out.println("被织入增强处理的目标方法为:"+joinPoint.getSignature().getName());}/** * 环绕通知 * ProceedingJoinPoint 是JoinPoint子接口,表示可以执行目标方法 * 1.必须是Object类型的返回值 * 2.必须接收一个参数,类型为ProceedingJoinPoint * 3.必须throws Throwable */publicObjectaround(ProceedingJoinPointpoint)throwsThrowable{System.out.println("这是环绕通知之前的部分!");//调用目标方法Objectobject=point.proceed();System.out.println("这是环绕通知之后的部分!");returnobject;}//异常通知publicvoidafterException(){System.out.println("异常通知!");}//后置通知publicvoidafter(){System.out.println("这是后置通知!");}}

创建后,项目内容如下:

6.创建配置文件

右击resourtces文件夹,选择“新建”,然后,点击“文件”。 文件名为:applicationContext.xml

<?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"><beanname="userDao"class="com.guo.aop.UserDaoImpl"/><beanname="xmlAdvice"class="com.guo.aop.XmlAdvice"/><aop:config><aop:pointcutid="pointcut"expression="execution(* com.guo.aop.UserDaoImpl.*(..))"/><aop:aspectref="xmlAdvice"><aop:beforemethod="before"pointcut-ref="pointcut"/><aop:after-returningmethod="afterReturning"pointcut-ref="pointcut"/><aop:aroundmethod="around"pointcut-ref="pointcut"/><aop:after-throwingmethod="afterException"pointcut-ref="pointcut"/><aop:aftermethod="after"pointcut-ref="pointcut"/>aop:aspect>aop:config>beans>

创建后,项目如下:

7.编写测试代码

测试代码可以放到测试类中,这里为了方便,暂时放到main函数中,我们创建main函数。 右击aop,点击“新建”,在点击“Java类”

类名为:XmlTest

参考代码:

packagecom.guo.aop;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassXmlTest{publicstaticvoidmain(String[]args){ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");UserDaouserDao=context.getBean("userDao",UserDao.class);userDao.delete();System.out.println();userDao.insert();System.out.println();userDao.select();System.out.println();userDao.update();}}

8.测试

运行后,可以看到,切面类代码正常切入,正常执行。

本文源代码下载:

1.百度网盘

通过网盘分享的文件:SpringAOPXml.zip

链接:https://pan.baidu.com/s/1Zkukv6eWID8RZtxsLS3BQg?pwd=iiej 提取码: iiej

2.夸克网盘

我用夸克网盘给你分享了「SpringAOPXml.zip」,点击链接或复制整段内容,打开「夸克APP」即可获取。

/0edc3b4gHe😕

链接:https://pan.quark.cn/s/daffd91621ea?pwd=HX7y

提取码:HX7y