学Java又想搞副业,你确定不来了解一下?文尾更精彩噢

简介: 学Java又想搞副业,你确定不来了解一下?文尾更精彩噢

谈副业必备模块

做过Web平台的,基本都清楚,大多数的Web平台都会需要记录接口调用的记录,不要小看它,认为它似乎没什么用,很多的个人习惯就是通过这种方式小成本的被挖掘出来。拿一个小规模的电商平台来说,只要把接口细化分类,我只需要记录某个接口的调用情况,我就知道哪些用户对哪些商品感兴趣,对于页面来说是一个商品点击事件,对于后台来说,就是某个接口某个数据的请求。

我们先了解一下,AOP一般常见场景,AOP的使用,更多用于日志场景、一般被用于日志诊断上下文,比如logback映射辅助上下文,或者用于辅助信息,比如方法执行时间,我们经常会在方法执行前获取一个时间,方法执行后获取一个时间,前者减去后者得到这个方法执行的时间。这些都是常用的手段。比较高级的是用在安防场景上,比如熔断、限流降级、认证授权、请求监控上等等。

进入主题

这次介绍的是,如何通过AOP来小成本的完成一个接口日志的记录,建议刚入行的新人,看完亲手敲一遍。

首先我们设计一个简单的表

DataBaseName

字段 类似 备注
id int 主键
url varchar(32) url接口
name varchar(32) 接口名
time dateTime 操作时间
user_no varchar(32) 用户编号
address varchar(32) ip地址
data json 具体数据

具体的可以根据你们自身的想法给表进行拓展,这里只是为了举例,我就简单设计了。

在注解使用上,我们这次主要用的是@Aspect、@Pointcut、@Around()这三个注解。

@Aspect:把当前类标记成一个切面给容器读取。

@Pointcut:使用与JoinPoint匹配的正则表达式,用于确认是否要执行Advice,是植入Advice的触发条件。举个例子,我把某个接口用Pointcut标记了,当这个接口被使用的时候,就会触发Advice。

@Around():表示使用的是环切,执行方法前,会先执行该注解下的方法内的逻辑,方法执行完后才会执行后续内容。

以下是具体代码:

@Aspect
@Component
public class LogAop {
    @Autowired
    private ActionLogService actionLogService;
    @Pointcut("execution(* xxx.xxx.xxx.*.controller..*.*(..)) && @annotation(io.swagger.annotations.ApiOperation)")
    public void targetLogAop() {
    }
    @Around("targetLogAop()")
    public Object Interceptor(ProceedingJoinPoint point) {
        MethodSignature signature = (MethodSignature) point.getSignature();
        ApiOperation annotation = signature.getMethod().getAnnotation(ApiOperation.class);
        //获取request
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        //获取传参
        Map<String, String[]> parameterMap = request.getParameterMap();
        //获取url
        String url = request.getRequestURI();
        //IP地址
        String address = request.getHeader("X-Forwarded-For");
        //接口描述
        String name = annotation.value();
        //获取当前账号信息
        User user = UserUtils.getUser();
        if (!"".equals(operationType)) {
            UserActionLog log = new UserActionLog();
            log.setAddress(address);
            log.setName(name);
            log.setData(parameterMap);
            log.setUrl(url);
            log.setTime(new Date());
            log.setUserNo(user.getUserNo());
            //新增记录
            actionLogService.addUserActionLog(log);
        }
        try {
            //执行后续方法内容
            return point.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
            throw new BaseRuntimeException(ExceptionMsg.fail(CodeEnum.OPERATION_FAIL, e.getMessage()));
        }
    }
}

简单讲解一下:

1.使用一个方法记录我们需要对哪些接口进行处理,这里我们可以对接口进行标记的同时,同时还可以标记带某个注解。

@Pointcut("execution(* xxx.xxx.xxx.*.controller..*.*(..)) && @annotation(io.swagger.annotations.ApiOperation)")
public void targetLogAop() {
}

该方法,标记了xxx.xxx.xxx.*.controller下的所有接口,并且接口必须标注了@ApiOperation接口才会被包含进去。

2.这个时候就可以在@ApiOperation备注一些信息,到时候可以当作表的name字段数据了。

@ApiOperation(value = "查询商品")

3.将标记的方法放近Around注解里,到时候执行到标记的接口的时候,就会先执行Interceptor方法。

@Around("targetLogAop()")
public Object Interceptor(ProceedingJoinPoint point) {
 ....
}

4.给这个类用上@Aspect、@Component来个注解,前者把当前类标记成一个切面给容器读取,后者把当前类作为一个组件给Spring管理。

@Aspect
@Component
@Slf4j
public class LogAop {
 ....
}


5.最后完善功能,做成一个标准的接口调用模块,我们就可以把这个模块打包成一个jar包,以后接到类似的功能,引用一下就可以省去很多工作。

学习也不忘面试

用到这里,简单的Spring AOP的使用就结束了,如果有人问Spring AOP和AspectJ AOP的区别在哪里?我可以用AspectJ去实现上面的功能吗?

答案是可以的。

1、因为Spring AOP只是AOP的部分实现,而AspectJ是AOP的完整实现。用来实现以上的问题绰绰有余。

2、但是如果非要说用法推荐的话,简单使用建议用Spring AOP,因为它只实现部分的结果就是它会比AspectJ在使用上更加简单。

3、Spring AOP 可以看成是Spring容器和AspectJ注解的整合。

4、Spring AOP仅支持代理模式的AOP和仅支持方法级别的Pointcuts。

总结

这一次的分享到此为止,虽然用例简单,但却可以很直接的表达出AOP的作用。

学习aop的方法不止一种,这也只是入门的一种方式,但是无论哪种方式,都避不开亲手敲代码,只能多敲多练习,这个知识点你才可以掌握。

我们下期接着聊,欢迎持续关注!

相关文章
|
11月前
|
设计模式 架构师 Java
真香!阿里Java知识体系详细总结(2023版)被我搞到手了
又是新的一年,每一年都会有人在成为架构师的路上或者已经成为自己心中理想的架构师,但更多的人是在程序员的这条路上缓慢成长甚至迷茫。
|
消息中间件 NoSQL Dubbo
手拿阿里「Java面试神技」,“脚踢”头条大门,不好意思我进来了
前言 随着金九银十的到来,许多家人们都在为工作而努力准备着,小轩也是为大家带来了一份大礼哦。
|
容灾 Java 开发者
我眼中的Java大牛之孤尽老师 ——《我的Java打怪日记》
本文将讲述自己和孤尽老师的一些“接触”,我眼中的孤尽老师是什么样的人,以及自己从孤尽老师身上学到了什么。 写孤尽老师的主要原因是我认为孤尽老师影响和帮助了很多人。 孤尽老师就像一盏明灯点亮学习之路上的漫漫夜空,就像一杆旗帜引领我们学习的方向。
121274 0
我眼中的Java大牛之孤尽老师 ——《我的Java打怪日记》
|
存储 Java 程序员
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(7)
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏
101 0
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(7)
|
Java
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(4)
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏
100 0
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(4)
|
Java
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(6)
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏
114 0
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(6)
|
存储 安全 Java
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(15)
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏
102 0
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(15)
|
IDE Java 开发工具
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(3)
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏
93 0
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(3)
|
安全 Java 编译器
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(17)
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏
91 0
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(17)
|
Java 编译器
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(13)
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏
112 0
怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏(13)