Springboot中AOP的简单使用

Spring AOP(Aspect Oriented Programming),即面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的补充和完善。

OOP引入的核心概念包括:封装,继承和多态等;

AOP则可以深入到方法内部,在某个切入点或者切面处采取静态”织入”的方式,在尽量不影响和改动原有代码的基础上,将新功能融入到原有的核心业务逻辑中。

譬如,在用户登录、下单、支付成功这些业务完成时,新增一项记录日志功能。

如果采用OOP,考虑可以使用继承,但登录/下单/支付这三个功能又没什么相同点,因此继承同一个父类的话比较勉强,同时也会造成代码冗余(毕竟要在每个子类中分别实现父类方法)。

示例如下:

①登录和支付的处理接口如下:

/**
 * @Description 登录处理
 **/
@RestController
public class LoginController extends BaseController{

    @RequestMapping("/login")
    public String login() throws Exception {
        return "登录成功!";
    }
}
/**
 * @Description 支付处理
 **/
@RestController
public class RepayController extends BaseController{

    @RequestMapping("/repay")
    public String repay() throws Exception{
        return "支付成功!";
    }
}

现在,需要实现【在登录和支付成功后记录操作日志】,前提:尽量不改动原有业务逻辑(即不改动LoginController和RepayController类):

②引入AOP依赖包:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

③创建日志注解:

@Documented
@Inherited //注解可被标注类的子类继承
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TKLog {
}

④创建AOP处理器

@Slf4j
@Aspect
@Component
public class LogInterceptor {
    //标注切入点,即标有@TKLog的类
    //@within:拦截被注解标注的类的所有方法,@annotation:拦截被注解的方法
    @Pointcut("@within(com.tk.spring.aop.annotation.TKLog)")
    public void pointcut() {
    }
    
    //当标有@TKLog的类中的方法被调用前后,该方法会被执行
    @Around("pointcut()")
    public void doExecute(ProceedingJoinPoint point) throws Throwable {
        log.info("方法即将执行:" + point.getSignature().getName());
        Object result = point.proceed();
        log.info("方法执行结束:" + result.toString());
    }
}

⑤在父类控制器BaseController添加日志注解@TKLog

/**
 * @Description 控制器的父类
 **/
@TKLog
public class BaseController {

}

⑥再次调用一下登录和支付接口,可以看到控制台打印出相关日志:

INFO 19884 --- [nio-8080-exec-1] c.t.s.aop.annotation.LogInterceptor : 方法即将执行:login
INFO 19884 --- [nio-8080-exec-1] c.t.s.aop.annotation.LogInterceptor : 方法执行结束:登录成功!
INFO 19884 --- [nio-8080-exec-2] c.t.s.aop.annotation.LogInterceptor : 方法即将执行:repay
INFO 19884 --- [nio-8080-exec-2] c.t.s.aop.annotation.LogInterceptor : 方法执行结束:支付成功!

点击获取本节:示例代码


版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接。
✿ 获取更多,请戳这儿

Comments
Write a Comment