Spring Boot自定义注解的使用场景主要包括以下几个方面:
1、服务治理:如前面所提到的服务限流、服务熔断等。通过自定义注解,可以很方便地对服务进行治理,提高系统的稳定性和可用性。
2、权限控制:自定义注解可以用于方法的权限控制。例如,通过自定义注解来标记某个方法需要特定的角色或权限才能访问,可以简化权限控制的代码,并提高代码的可读性。
3、日志记录:通过自定义注解,可以方便地记录方法的调用日志。例如,可以在方法的入参和出参上添加自定义注解,然后在切面中解析注解,记录相关的日志信息。
4、参数校验:在某些场景下,可能需要对方法的参数进行校验。通过自定义注解,可以很方便地实现对参数的校验。例如,可以定义一个校验注解,然后在切面中解析注解,对参数进行相应的校验。
5、缓存控制:自定义注解还可以用于缓存控制。例如,通过自定义注解来标记某个方法的返回值需要被缓存,或者在某个条件下需要清除缓存。
6、自定义业务逻辑:除了上述的场景,自定义注解还可以用于实现各种自定义的业务逻辑。只要是通过注解和切面能够实现的功能,都可以作为自定义注解的使用场景。
下面展示一个通过自定义注解实现日志记录
-
定义自定义注解
首先,定义一个用于日志记录的自定义注解,例如@Log。这个注解可以包含一些元数据,例如日志消息、日志级别等。
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
String value() default ""; // 默认日志消息
LogLevel level() default LogLevel.INFO; // 默认日志级别
}
// 定义日志级别枚举
public enum LogLevel {
INFO, DEBUG, ERROR
}
-
实现日志记录切面
创建一个切面,例如LoggingAspect,来处理日志记录的逻辑。这个切面应该包含一个通知(Advice),它会在被注解的方法被调用之前、之后或抛出异常时执行。
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
@Before("@annotation(log)")
public void logBefore(JoinPoint joinPoint, Log log) {
// 在方法调用前记录日志
switch (log.level()) {
case INFO:
logger.info(buildLogMessage(joinPoint, log));
break;
case DEBUG:
logger.debug(buildLogMessage(joinPoint, log));
break;
case ERROR:
logger.error(buildLogMessage(joinPoint, log));
break;
}
}
// 如果有需要,你还可以添加 @After, @AfterReturning, @AfterThrowing 等通知方法,来在方法调用后、返回后、抛出异常后记录日志。
private String buildLogMessage(JoinPoint joinPoint, Log log) {
// 构建日志消息,这里只是一个简单示例,你可以根据实际需要调整日志消息的格式和内容。
return String.format("[Log] %s is called with args: %s. Log message: %s",
joinPoint.getSignature().getName(), joinPoint.getArgs(), log.value());
}
}
-
应用自定义注解
现在你可以在任何需要日志记录的方法上使用@Log注解。例如:
@Service
public class MyService {
@Log(value = "This method is called.", level = LogLevel.DEBUG)
public String myMethod(String arg1, int arg2) {
// 方法逻辑...
return "Result";
}
}
在这个例子中,每次myMethod被调用时,都会记录一条调试级别的日志,日志消息为"This method is called."。同时,你可以通过改变value和level来调整日志消息和日志级别。你也可以在更多的方法上使用这个注解,来实现统一的日志记录功能。