在Spring Boot項目中可以使用AOP實現自定義注解,從而實現統一、侵入性小的自定義功能。
實現自定義注解的過程也比較簡單,只需要3步,下面實現一個統一打印日志的自定義注解:
1. 引入AOP依賴
在pom文件中引入AOP的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 定義注解
定義注解的屬性:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TraceLog {
/**
* 業務
*/
String business();
/**
* 模塊
*/
String module();
}
3. 定義切面
@Aspect
@Component
@Slf4j
public class TraceLogSupport {
@Pointcut("@annotation(com.acode.log.annotation.TraceLog)")
private void pointcut() {
}
@Before("pointcut()&&@annotation(traceLog)")
public void before(JoinPoint joinPoint, TraceLog traceLog) {
Object[] args = joinPoint.getArgs();
log.error(generateLog(traceLog, JSON.toJSONString(args)));
}
private String generateLog(TraceLog traceLog, String args) {
List<String> elements = ImmutableList.of(
traceLog.business(),
traceLog.module(),
args
);
return String.join(";", elements);
}
}
使用注解
在想要使用的方法上加上注解即可,使用例子如下:
@RequestMapping("/login")
@TraceLog(business = "CRM", module = "LOGIN")
public String login(LoginParam param) {
return param.toString();
}
其中,入參的定義如下:
public class LoginParam {
private String userName;
private String password;
}
當訪問登錄接口時,就會在日志中打印入口參數(在線上環境中是不允許直接明文打印用戶的密碼):
CRM;LOGIN;[{"password":"123456","userName":"admin"}]