springboot 注解一般和aop同时使用
在Spring Boot中,注解和AOP(面向切面编程)通常结合使用,以实现横切关注点(如日志记录、事务管理、安全性等)的分离和代码的解耦。以下是一些常用的Spring Boot注解和它们在AOP中的应用:
-
@Aspect:这是一个类级别的注解,用于声明一个切面(Aspect)。切面是AOP的核心概念之一,它封装了横切关注点。
-
@Before、@After、@AfterReturning、@AfterThrowing、@Around:这些注解用于定义不同类型的通知(Advice),即在切点(Pointcut)触发时执行的代码。
- @Before:在目标方法执行之前执行。
- @After:在目标方法执行之后执行,无论方法是否成功完成。
- @AfterReturning:在目标方法成功完成后执行。
- @AfterThrowing:在目标方法抛出异常后执行。
- @Around:可以自定义在目标方法的前后执行的代码。
-
@Pointcut:用于定义切点表达式,标识哪些方法会触发通知的执行。可以在类中定义公共的切点表达式,在多个通知中使用。
-
@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结合使用,可以让代码更加整洁,将横切关注点与业务逻辑分离,提高代码的可维护性和可重用性。