springboot 自定义注解一般和aop同时使用

springboot 注解一般和aop同时使用

在Spring Boot中,注解和AOP(面向切面编程)通常结合使用,以实现横切关注点(如日志记录、事务管理、安全性等)的分离和代码的解耦。以下是一些常用的Spring Boot注解和它们在AOP中的应用:

  1. @Aspect:这是一个类级别的注解,用于声明一个切面(Aspect)。切面是AOP的核心概念之一,它封装了横切关注点。

  2. @Before、@After、@AfterReturning、@AfterThrowing、@Around:这些注解用于定义不同类型的通知(Advice),即在切点(Pointcut)触发时执行的代码。

    • @Before:在目标方法执行之前执行。
    • @After:在目标方法执行之后执行,无论方法是否成功完成。
    • @AfterReturning:在目标方法成功完成后执行。
    • @AfterThrowing:在目标方法抛出异常后执行。
    • @Around:可以自定义在目标方法的前后执行的代码。
  3. @Pointcut:用于定义切点表达式,标识哪些方法会触发通知的执行。可以在类中定义公共的切点表达式,在多个通知中使用。

  4. @EnableAspectJAutoProxy:通常加在配置类上,用于启用基于注解的AOP模式。

示例

以下是一个简单的AOP示例,展示如何使用Spring注解和AOP来实现方法执行时间的日志记录:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceMethods() {}

    @Around("serviceMethods()")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object proceed = joinPoint.proceed();
        long executionTime = System.currentTimeMillis() - start;

        System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        return proceed;
    }
}

在这个示例中:

  • 我们声明了一个切面LoggingAspect
  • @Pointcut 注解定义了一个切点,匹配com.example.service包中的所有方法。
  • @Around 注解定义了一个环绕通知,用于记录方法执行时间。

springboot 自定义注解一般和aop同时使用

在Spring Boot中,自定义注解通常与AOP结合使用,以实现特定的横切关注点。例如,你可以创建自定义注解来处理日志记录、权限验证、事务管理等。以下是如何实现自定义注解与AOP结合使用的步骤:

步骤 1: 创建自定义注解

首先,定义一个自定义注解。这是一个简单的Java注解,可以用于标识需要特殊处理的方法。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecutionTime {
}

步骤 2: 创建切面类

接下来,创建一个切面类,该类会使用AOP技术来拦截带有自定义注解的方法。这里我们仍然使用上面的日志记录为例。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Around("@annotation(LogExecutionTime)")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object proceed = joinPoint.proceed();
        long executionTime = System.currentTimeMillis() - start;

        System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        return proceed;
    }
}

步骤 3: 使用自定义注解

现在你可以在任何Spring Bean的方法上使用@LogExecutionTime注解,以便在该方法被调用时执行日志记录功能。

import org.springframework.stereotype.Service;

@Service
public class MyService {

    @LogExecutionTime
    public void serve() throws InterruptedException {
        // 模拟方法执行时间
        Thread.sleep(2000);
    }
}

关键点:

  • @Retention(RetentionPolicy.RUNTIME):指定注解在运行时可用。
  • @Target(ElementType.METHOD):指定注解可以用于方法。
  • @Aspect:声明切面类。
  • @Around(“@annotation(LogExecutionTime)”):指定切面应该围绕所有带有@LogExecutionTime注解的方法执行。

通过这种方式,自定义注解与AOP结合使用,可以让代码更加整洁,将横切关注点与业务逻辑分离,提高代码的可维护性和可重用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值