SpringBoot AOP 实现日志记录:面向切面编程的应用
SpringBoot 可以通过引入 AOP (面向切面编程) 来实现一些通用的功能,如日志记录、异常处理、安全控制等。在 SpringBoot 中,我们可以使用 @AspectJ 注解来声明切面,并使用 @Pointcut 来定义切点,然后使用 @Before、@After、@Around 等注解来定义不同的通知(advice)。
以下是一个简单的 AOP 示例,用于记录方法执行时间:
- 引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 定义切面:
@Aspect
@Component
public class PerformanceAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(PerformanceAspect.class);
@Pointcut('execution(* com.example.demo.service.*.*(..))')
public void performance() {}
@Around('performance()')
public Object logPerformance(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
LOGGER.info('{} executed in {} ms', joinPoint.getSignature(), endTime - startTime);
return result;
}
}
以上代码中,@Aspect 注解表示这是一个切面类,@Component 注解表示该类可以被 Spring 容器扫描到并管理。@Pointcut 注解定义了一个切点,用于匹配所有 com.example.demo.service 包下的方法。@Around 注解表示在方法执行前后织入通知,其中 ProceedingJoinPoint 参数表示连接点,可以通过它获取方法签名、参数等信息,proceed() 方法表示执行目标方法。
- 测试:
@Service
public class DemoService {
public void test() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private DemoService demoService;
@Test
public void test() {
demoService.test();
}
}
运行测试类,可以看到日志输出:
com.example.demo.service.DemoService.test() executed in 1000 ms
原文地址: https://www.cveoy.top/t/topic/lEi3 著作权归作者所有。请勿转载和采集!