Spring的AOP快速实现通用日志打印
需求分析#
针对VideoService接口实现日志打印
三个核心包#
- spring-aop:AOP核心功能,例如代理工厂
- aspectjweaver:简单理解,支持切入点表达式
- aspectjrt:简单理解,支持aop相关注解
定义Service接口和实现类#
VideoService.java
package net.cybclass.sp.servicce; import net.cybclass.sp.domain.Video; public interface VideoService { int save(Video video); Video findById(int id); }
VideoServiceImpl.java
package net.cybclass.sp.servicce; import net.cybclass.sp.domain.Video; public class VideoServiceImpl implements VideoService{ public int save(Video video) { System.out.println("保存Video"); return 0; } public Video findById(int id) { System.out.println("根据id找视频"); return new Video(); } }
定义横切关注点#
<bean id="timeHandler" class="net.cybclass.sp.aop.TimeHandler"></bean> <bean id="videoService" class="net.cybclass.sp.servicce.VideoServiceImpl"></bean> <!-- aop的配置 --> <aop:config> <!--切面--> <aop:aspect id="timeAspect" ref="timeHandler"> <!--连接点--> <aop:pointcut id="allMethodLogPointCut" expression="execution(* net.cybclass.sp.servicce.VideoService.*(..))"/> <!--前置通知--> <aop:before method="printBefore" pointcut-ref="allMethodLogPointCut"></aop:before> <!--后置通知--> <aop:after method="printBefore" pointcut-ref="allMethodLogPointCut"></aop:after> </aop:aspect> </aop:config>
完整版applicationContext.xml
<?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" 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"> <bean id="timeHandler" class="net.cybclass.sp.aop.TimeHandler"></bean> <bean id="videoService" class="net.cybclass.sp.servicce.VideoServiceImpl"></bean> <!-- aop的配置 --> <aop:config> <!--切面--> <aop:aspect id="timeAspect" ref="timeHandler"> <!--连接点--> <aop:pointcut id="allMethodLogPointCut" expression="execution(* net.cybclass.sp.servicce.VideoService.*(..))"/> <!--前置通知--> <aop:before method="printBefore" pointcut-ref="allMethodLogPointCut"></aop:before> <!--后置通知--> <aop:after method="printBefore" pointcut-ref="allMethodLogPointCut"></aop:after> </aop:aspect> </aop:config> </beans>
引入相关包#
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency>
完整pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="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>net.cybcclass</groupId> <artifactId>cyb_spring</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> </dependencies> </project>
演示#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?