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

首先,利用 spring initializr 构建 一个web项目,勾选下面两种

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

创建好项目之后,写一个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);
}

}

来看看结果

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


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

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