SpringBoot之AOP使用

说到SpringBoot,难免会想到Spring。
对于Spring,我曾用其开发过很多大大小小的项目。
当使用SpringBoot之后,给人最直观的感受,用古人一句话:”大道至简”。

SpringBoot相比Spring,它的优点其实就是Spring的缺点或不足:

(1)内嵌入Tomcat、Jetty等容器,无需Tomcat就能直接跑起来(这让我想到开发一个庞大的项目,光启动Tomcat就需要花好几分钟);

(2)部署方便,一个可执行的Jar,你可以将其以Docker容器的形式管理部署,也可以使用nohub命令让其持久运行在服务器上;

(3)无需管理一大堆繁重的xml配置(记得初次接触Spring的时候,它给最直观的感受就是将对象交给Spring管理,其实也就是在对应的xml进行配置,不再像很久以前那样自己New之类的,New十几二十个还好,但是一个实际项目,对象太庞大了,如果沿用传统new的方式来管理对象的话,那么将会耗费很多时间精力在这上面,不能很好的集中精力进行业务开发,因为需要考虑对象的初始化以及销毁等),而当我使用SpringBoot以后开发项目,基本上SpringBoot很好的集成第三方库,需要什么就是直接在application.yml或application.properties直接配置即可;

(4)提供的starter-web简化Maven配置(整合常用依赖,相当于将一些web常用jar集成进去,省的我们一个个导入还需要考虑版本兼容性问题);

可以从spring-boot-starter-web依赖传递可以看出,如图:

(5)创建独立的Spring应用(更好的适用于微服务开发);

SpringAOP的应用场景

从实际开发出发,举两个典型例子简单概括一下:
(1)可用于做接口权限控制或者是权限控制;
(2)可用于检测接口请求并统计接口请求次数;

实际上可以从这么几个方面深入挖掘?
(1)日志记录;
(2)性能统计;
(3)安全控制(可以理解为权限控制);
(4)事务处理;
(5)异常处理;

我想每个Java开发者对于这五个方面再了解不过了。

以监听接口请求为例

核心代码如下:

package com.blog.springboot.aop;
import java.util.HashMap;
import java.util.Map;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import cn.hutool.core.lang.Console;
/**
 * 系统日志类(用于统计接口请求)
 * @author youcong
 * @date 2019-09-05
 */
@Aspect
@Component
public class SystemLogAspect {

  @Pointcut("execution(public * com.blog.springboot.controller..*.*(..))")
  public void Pointcut() {

      Console.log("走你");
  }

    //@Around:环绕通知
    @Around("Pointcut()")
    public Object Around(ProceedingJoinPoint pjp) throws Throwable {
        Map<String,Object> data = new HashMap<>();
        //获取目标类名称
        String clazzName = pjp.getTarget().getClass().getName();
        //获取目标类方法名称
        String methodName = pjp.getSignature().getName();

        //记录类名称
        data.put("clazzName",clazzName);
        //记录对应方法名称
        data.put("methodName",methodName);
        //记录请求参数
        data.put("params",pjp.getArgs());
        //开始调用时间
        // 计时并调用目标函数
        long start = System.currentTimeMillis();
        Object result = pjp.proceed();
        Long time = System.currentTimeMillis() - start;

        //记录返回参数
        data.put("result",result);

        //设置消耗总时间
        data.put("consumeTime",time);
        System.out.println(data);
        return result;

    }

}

基本上每次请求接口都会获取到对应的接口信息并输出。

如果后台这边需要统计接口请求次数,针对某些接口请求非常频繁,可考虑加缓存或者是进行其它优化等。

SpringAOP之常用注解

简单的说一下AOP,AOP又称面向切面编程,它的常用术语如下:

连接点(Joinpoint)

增强程序执行的某个特定位置(要在哪个地方做增强操作)。SPring仅支持方法的连接点,既仅能在方法调用前,方法调用后,方法抛出异常时等这些程序执行点进行织入增强。

切点(Pointcut)

切点是一组连接点的集合。AOP通过”切点”定位特定的连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过来:连接点相当于数据库中的记录,而切点相当于查询条件。

增强(Advice)

增强是织入到目标类连接点上的一段程序代码。表示要在连接点上做的操作。

切面(Aspect)

切面由切点和增强(引介)组成(可以包含多个切点和多个增强),它既包括横切逻辑的定义,也包括连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的链接点中。

SpringAOP常用注解如下:
@aspect(定义切面)
@pointcut(定义切点)
@before(标注Before Advice定义所在的方法)
@afterreturning(标注After Returning Advice定义所在的方法)
@afterthrowing(标注After Throwing Advice定义所在的方法)
@after(标注After(Finally)Advice定义所在的方法)
@around(标注Around Advice定义所在的方法)

原文地址:https://www.cnblogs.com/youcong/p/11488554.html

时间: 2024-10-10 09:04:17

SpringBoot之AOP使用的相关文章

Spring全家桶——SpringBoot之AOP详解

Spring全家桶--SpringBoot之AOP详解 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面. 准备工作 首先,使用AOP要在build.gradle中加入依赖 //引入AOP依赖 compile "org.springframework.boot:spring-boot-starter-aop:${springBootVersion}" 然后在application.yml中

springboot添加AOP日志配置

目录 1,在pom.xml配置文件中添加以下配置 2,自定义配置文件logback.xml,该配置文件位置在templates文件夹下第一层,和html文件夹位置并列. 3,logback.xml文件配置内容 4,写一个LogUtil类 @(springboot添加aop) 1,在pom.xml配置文件中添加以下配置 <!--spring aop 包--> <dependency> <groupId>org.springframework.boot</groupI

SpringBoot整合aop日志管理

1. 开发前准备 1.1 前置知识 java基础自定义注解.反射 Spring aop SpringBoot简单基础知识即可 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lombok.mybatisplus.Spring aop SpringBoot版本:2.1.4 1.3 涉及知识点 自定义注解. 反射 spring aop 环绕通知 2. aop日志实现 AOP(Aspect Oriented Programming)是一个大话题,这

springboot 集成aop模块

aop 是spring的核心之一,在springboot之前,使用AOP已经相对比较多了,主要在开发中用于实现日志记录,安全校验,权限等功能. 在springboot把Spring的核心功能都简化使用之后,aop的配置并没有太大的变化,基本还是原来的使用. 我们做系统增强,分为前增强,后增强,环绕增强 三种基本类型,当然我看还有一些实现了return 增强之类的,本质上都一样的. Springboot通过@Aspect注解来实现aop 的功能.我们在使用的时候,需要在类上面声明好这个注解. 同时

SpringBoot 配置 AOP 打印日志

在项目开发中,日志系统是必不可少的,用AOP在Web的请求做入参和出参的参数打印,同时对异常进行日志打印,避免重复的手写日志,完整案例见文末源码. 一.Spring AOP AOP(Aspect-Oriented Programming,面向切面编程),它利用一种"横切"的技术,将那些多个类的共同行为封装到一个可重用的模块.便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性. AOP中有以下概念: Aspect(切面):声明类似于Java中的类声明,在Asp

SpringBoot使用AOP记录请求日志和异常日志

本文基础WEB环境使用SpringBoot及Spring-Data-Jpa构建 关于SpringBoot及JPA用法本文不再过多讨论,下面是引入的jar: 起步依赖 web及aop依赖 jpa依赖 mysql驱动 本文着重AOP的使用,你也可以使用自己构建的环境 由于本文中使用的JPA,因此首先创建保存日志及保存异常的实体类,如果你使用的是Mybatis,则需要首先创建表然后根据表来逆向生成实体类 保存日志的实体类: 日志实体 保存异常的实体类: 异常实体 接下来我们定义一个Operation注

Springboot 中AOP的使用

面向切面编程(Aspect Oriented Programming) 是软件编程思想发展到一定阶段的产物,是面向对象编程的有益补充.AOP一般适用于具有横切逻辑的场合,如访问控制.事务管理.性能检测等. 日志.异常处理.事务控制等都是一个健壮的业务系统所必须的.但是为了保证系统健壮可用,就要再众多业务方法中反复编写类似的代码,使得原本就很复杂的业务处理代码变得更加复杂.业务功能的开发者还要考两次这些额外的代码是否处理正确,是否有遗漏的地方,如果需要修改日志信息的格式或者安全验证的规则,或者再增

springboot配置aop切面日志打印

一.SpringBoot Aop说明 1. Aop AOP(Aspect-Oriented Programming,面向切面编程),它利用一种”横切”的技术,将那些多个类的共同行为封装到一个可重用的模块.便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性. 2. AOP相关概念: Aspect(切面):声明类似于Java中的类声明,在Aspect中会包含一些Pointcut及相应的Advice. Joint point(连接点):表示在程序中明确定义的点.包括方法的调

SpringBoot—集成AOP详解(面向切面编程Aspect)

AOP介绍 AOP概述 ??AOP是Aspect-Oriented Programming,即为面向(切面)方面编程.在维基百科中的解释:Aspect是一种新的模块化机制,用来描述分散在对象.类或函数中的横切关注点.从关注点中分离出横切关注点是面向切面的程序设计核心概念.分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑代码不需要再包含针对特定领域问题代码的调用,比如一些公用模块的日志.安全等代码. ??代码通过切面抽离,更加整齐和清晰,将重复的代码抽取出来单独的进行维护,在需要