什么是AOP?
AOP: Aspect Oriented Programming 面向切面编程。是一种编程思想。通过切面织入的方式,对目标业务做功能上的增强。
主要目的是将独立的业务或通用的业务行为(比如事物、日志、异常处理等),与核心业务区分开,从代码中抽离出来,以另一种方式,动态织入到目标业务方法的前后。
优点:降低代码的耦合度,提高可重用性。
实现AOP思想的核心角色
- 关注点: 要对哪些业务方法进行增强,要进行怎样的增强。
- 切入点(PointCut):要在代码执行到哪里进行织入。通常是表达式指定或指定注解
- 切面(Aspect),通常是一个类,定义了切入点和通知。
Spring的通知
Spring的通知就是指定将代码以何种方式织入到目标业务中去。Spring定义了五中通知类型:
前置通知,后置通知,环绕通知、最终通知、异常通知
类型 | 描述 | 注解 |
---|---|---|
前置通知 | 在目标方法被调用之前执行 | @Before |
后置通知 | 在目标方法正常完成后执行 | @AfterReturning |
环绕通知 | 在目标方法完成前后都做执行 | @Around |
最终通知 | 目标方法完成之后执行,无论目标方法是否成功完成 | @After |
异常通知 | 在目标方法抛出异常时执行 | @AfterThrowing |
使用Spring AOP思想实现登录日志
首先在Controller中有一个登录方法,为了方便,我就不再写Service层了,直接把登录逻辑写到Controller中
@RequestMapping("login")
public ResponseData<User> login(@RequestParam(value="username")String username,
@RequestParam(value="username")String password) {
// 调用service 根据用户名查询用户的方法
User user = userService.getOne(new QueryWrapper<User>()
.eq("username", dto.getUsername()));
if (!SomeUtils.isNoEmpty(user)) {
// 用户不存在,抛异常
throw new WtaoException(AuthExceptionEnum.ACCOUNT_NOT_FOUND);
}
if (!user.getPassword().equals(dto.getPassword())) {
// 密码错误,抛异常
throw ne