面向对象编程?no!今天来说说面向切片编程

当前的环境下,面向对象编程是一个比较常见的话题,各大社区都拿这个事儿来调侃程序员。实际上,除了面向对象编程,程序员还有各种各样的编程模式,包括,面向过程编程,面向服务编程,面向切面编程等等。今天,我就带大家用springboot写一个切面编程的例子。

首先,利用 spring initializr 构建 一个web项目,勾选下面两种
在这里插入图片描述

创建好项目之后,写一个controller,如下:

package com.chaojilaji.testaop.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

@Controller
public class TestController {


    @RequestMapping(value = "/testaop", method = RequestMethod.GET)
    @ResponseBody
    public Map<String,Object> getTest(){
        Map<String,Object> ans = new HashMap<>();
        ans.put("code",200);
        return ans;
    }
}

这是一个普通的控制器,前端发来一个 /testaop 的请求,后端返回code=200的响应。接下来,我们来定义一个切面,实现每次在返回响应的时候打印出返回的结果。这个场景可用于判断是否出现了接口调用异常的情况。下面来看看代码:

package com.chaojilaji.testaop.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TestAop {

    private static Logger logger = LoggerFactory.getLogger(TestAop.class);

    @Pointcut("execution(public * com.chaojilaji.testaop.controller.TestController.*(..))")
    public void log() {

    }

    @Before("log()")
    public void doBefore(JoinPoint joinPoint) {
        logger.info("who: {}", joinPoint.getSignature().getDeclaringTypeName() + " " + joinPoint.getSignature().getName());
    }

    @After("log()")
    public void doAfter() {

    }

    @AfterReturning(returning = "obj", pointcut = "log()")
    public void doAfterReturning(Object obj) {
        logger.info("result: {}", obj);
    }

}

来看看结果
在这里插入图片描述
在这里插入图片描述

当然,这点点应用对于面向切片编程来说肯定是九牛一毛。目前我正在考虑如何在整个系统中推进切面进而做好日志的问题

猜你喜欢

转载自blog.csdn.net/xielinrui123/article/details/89098791