[Java Spring] Aspect
Create you own decreator!
Add dependency:
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency>
aspect/Loggable.java:
package com.frankmoley.lil.fid.aspect; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Loggable { }
aspect/LoggingAspect.java:
package com.frankmoley.lil.fid.aspect; import java.util.Arrays; import java.util.Collection; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component @Aspect public class LoggingAspect { private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAspect.class); @Pointcut("@annotation(Loggable)") public void executeLogging(){} @AfterReturning(value = "executeLogging()", returning = "returnValue") public void logMethodCall(JoinPoint joinPoint, Object returnValue){ StringBuilder message = new StringBuilder("Method: "); message.append(joinPoint.getSignature().getName()); Object[] args = joinPoint.getArgs(); if (null!=args && args.length>0){ message.append(" args=[ | "); Arrays.asList(args).forEach(arg->{ message.append(arg).append(" | "); }); message.append("]"); } if(returnValue instanceof Collection){ message.append(", returning: ").append(((Collection)returnValue).size()).append(" instance(s)"); }else{ message.append(", returning: ").append(returnValue.toString()); } LOGGER.info(message.toString()); } }
Using;
@Service public class GreetingService { @Value("${app.greeting}") private String greeting; public GreetingService(){ super(); } @Loggable public String getGreeting(String name){ return greeting + " " + name; } }
Around:
@Around(value = "executeLogging()") public Object logMethodCall(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object returnValue = joinPoint.proceed(); long totalTime = System.currentTimeMillis()-startTime; StringBuilder message = new StringBuilder("Method: "); message.append(joinPoint.getSignature().getName()); message.append(" totalTime: ").append(totalTime).append("ms"); Object[] args = joinPoint.getArgs(); if (null!=args && args.length>0){ message.append(" args=[ | "); Arrays.asList(args).forEach(arg->{ message.append(arg).append(" | "); }); message.append("]"); } if(returnValue instanceof Collection){ message.append(", returning: ").append(((Collection)returnValue).size()).append(" instance(s)"); }else{ message.append(", returning: ").append(returnValue.toString()); } LOGGER.info(message.toString()); return returnValue; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-12-09 [Algorithm] 242. Valid Anagram
2019-12-09 [Algorithm] 155. Min Stack
2017-12-09 [Python] Format Strings in Python
2017-12-09 [Python] Execute a Python Script
2017-12-09 [Python] Understand Mutable vs. Immutable objects in Python
2017-12-09 [Python] Check for None (Null) in Python
2017-12-09 [Python] Manage Dependencies with Python Virtual Environments