SpringBoot 可以通过引入 AOP (面向切面编程) 来实现一些通用的功能,如日志记录、异常处理、安全控制等。在 SpringBoot 中,我们可以使用 @AspectJ 注解来声明切面,并使用 @Pointcut 来定义切点,然后使用 @Before、@After、@Around 等注解来定义不同的通知(advice)。

以下是一个简单的 AOP 示例,用于记录方法执行时间:

  1. 引入依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 定义切面:
@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() 方法表示执行目标方法。

  1. 测试:
@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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录