注解可以方便快捷地给方法或类加上标记,用于识别它们的作用。在Spring AOP中,我们可以通过在方法上使用注解来实现操作日志记录。本文将介绍如何使用Spring AOP结合注解实现接口层操作日志记录。
- 添加依赖
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.5.5</version>
</dependency>
- 创建注解
首先,我们需要创建一个注解,标记需要记录操作日志的接口方法。可以根据实际需求自定义注解的名称和属性。以下是一个示例:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
String value() default "";
}
这个注解取名为Log
,只能标记在方法上,并且定义了一个名为value
的属性,默认值为空字符串。
- 创建切面
接下来,我们需要创建一个切面,来拦截标记了Log
注解的接口方法,并记录操作日志。以下是一个示例:
@Aspect
@Component
public class LogAspect {
@Autowired
private Logger logger;
@Pointcut("@annotation(com.example.demo.annotation.Log)")
public void logPointCut() {}
@Around("logPointCut()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
String className = joinPoint.getTarget().getClass().getName();
String methodName = method.getName();
String logMsg = method.getAnnotation(Log.class).value();
Object[] args = joinPoint.getArgs();
try {
Object result = joinPoint.proceed();
logger.info("{}-{}:{}-result:{}", className, methodName, logMsg, result);
return result;
} catch (Throwable throwable) {
logger.error("{}-{}:{}-exception:{}", className, methodName, logMsg, throwable.getMessage());
throw throwable;
}
}
}
首先,我们用注解@Aspect
将这个切面声明为一个切面。然后,用注解@Component
将其声明为一个Spring组件,以便被识别。
在这个切面中,我们定义了一个切点logPointCut()
,用于匹配标记了Log
注解的接口方法。
然后,在切面中,我们使用@Around
注解来标记一个环绕通知,用于在执行接口方法之前和之后执行一些操作。
在环绕通知中,我们首先通过joinPoint.getSignature()
方法获取方法的签名,进而获取方法名和类名。然后,使用method.getAnnotation(Log.class)
方法获取Log
注解的属性值,并将其记录到日志中。
在记录日志之前,我们先获取接口方法的参数,然后使用joinPoint.proceed()
方法执行接口方法,并获取返回值。最后,将返回值记录到日志中。
如果接口方法执行出现异常,我们也要记录异常信息,并将其抛出。
- 标记接口方法
最后,我们需要在需要记录操作日志的接口方法上标记Log
注解,例如:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
@Log("添加用户")
public void addUser(User user) {
userDao.addUser(user);
}
@Override
@Log("删除用户")
public void deleteUser(int userId) {
userDao.deleteUser(userId);
}
}
在这个示例中,我们在addUser
方法和deleteUser
方法上分别标记了Log
注解,并指定了需要记录的操作名称。
- 测试
现在,我们就可以直接注入UserService
服务,并调用其方法,观察操作日志是否被记录了。例如:
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/addUser")
public void addUser(@RequestBody User user) {
userService.addUser(user);
}
@DeleteMapping("/deleteUser/{userId}")
public void deleteUser(@PathVariable int userId) {
userService.deleteUser(userId);
}
}
注:需要注意的是,上述示例的logger
对象需要我们自己定义。
以上就是使用Spring AOP结合注解实现接口层操作日志记录的完整攻略和示例说明。通过这种方式记录操作日志,可以方便地查看操作记录,帮助我们更好地监控系统运行状况。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring AOP结合注解实现接口层操作日志记录 - Python技术站