在Springboot中实现一个简单的aop
(1)引入aop的依赖
要确保maven项目中已经添加了springboot的依赖。
<!--spring切面aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
(2)日志要记录在数据库中,要有对应的bean实体类
public class Operation {
private Long id;
private String identity ; // 操作人账号
private String clientIp ; // 客户端ip
private String username ; // 操作人姓名
private Long operType ; // 日志类型
private String operUrl ; // 操作的url
private String operEvent ; // 操作事件
private String reqParam ; // 请求参数信息
private String reqType ; // 请求方式:POST或者GET
private Date operTime ; // 操作时间
//提供set和get方法
}
(3)自定义一个注解类,也就是一个切入点
@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface ViLog {
/** 操作事件 */
String operEvent () default "";
/** 日志类型 */
int operType ();
}
(4)定义一个切面类,进行具体的记录工作
/** 系统日志:切面处理类 */
@Aspect
@Component
public class SysLogAspect {
private static final Logger log = LoggerFactory.getLogger(SysLogAspect.class);
@Autowired
private IOperationService operationService;
//定义切点 @Pointcut
//在注解的位置切入代码
@Pointcut("@annotation(自定义注解类的全路径)")
public void logPoinCut() {}
//切面 配置通知
@Before("logPoinCut()")
public void saveOperation(JoinPoint joinPoint) {
//保存日志操作
}
}
(5)在需要检测的接口添加注解
//例如在contoller类的方法上加注解
@RestController
@RequestMapping("/sysMenuController")
public class SysMenuController extends AbstractController {
@ViidLog(operEvent = "删除菜单记录")//定义织入点
@PostMapping("/del")
public void deleteBatch(@RequestBody Long[] menuIds) {
}
}
简单的切入点、织入点都在注释中和类结合起来说明了,如果只看概念可能有些抽象,这样结合代码说明更形象一些了。