Spring AOP统一功能处理示例代码

目录
  • 1. 什么是Spring AOP?
  • 2. 为什要用 AOP?
  • 3. Spring AOP 应该怎么学习呢?
    • 3.1AOP组成
      • 3.1.1 切面(Aspect)
      • 3.1.2 连接点(Join Point)
      • 3.1.3 切点(Pointcut)
      • 3.1.4 通知(Advice)
    • 3.2 Spring AOP实现
      • 3.2.1 添加 AOP 框架支持
      • 3.2.2 定义切面和切点。
      • 3.2.3 定义相关通知
    • 3.3 Spring AOP 实现原理
      • 3.3.1 动态代理
      • 3.3.2 JDK和CGLIB实现的区别
      • 3.3.3 织入(Weaving):代理的生成时机
      • 3.3.4 总结
  • 4. SpringBoot 统一功能处理
    • 4.1 用户登录权限效验
      • 4.1.1 Spring拦截器
      • 4.1.2 自定义拦截器
      • 4.1.3 将自定义拦截器加入到系统配置
      • 4.1.4 拦截器实现原理
      • 4.1.5 拦截器小结
      • 4.1.6 扩展:统⼀访问前缀添加
    • 4.2 统一异常处理
    • 4.2 统一数据返回格式
      • 4.2.1 为什么需要统一数据返回格式?
      • 4.2.2 统一数据返回格式的实现
  • 总结

1. 什么是Spring AOP?

在介绍Spring AOP之前,首先要了解一下什么是AOP?

AOP (Aspect Oriented Programming)︰面向切面编程,它是一种思想,它是对某一类事情的集中处理。比如用户登录权限的效验,没学AOP之前,我们所有需要判断用户登录的页面(中的方法),都要各自实现或调用用户验证的方法,然而有了AOP之后,我们只需要在某一处配置一下,所有需要判断用户登录页面(中的方法)就全部可以实现用户登录验证了,不再需要每个方法中都写相同的用户登录验证了。

而AOP是一种思想,而Spring AOP是一个框架,提供了一种对AOP思想的实现,它们的关系和loC与DI类似。

2. 为什要用 AOP?

我们之前的处理方式是每个Controller都要写一遍用户登录验证,然而当你的功能越来越多,那么你要写的登录验证也越来越多,而这些方法又是相同的,这么多的方法就会代码修改和维护的成本。那有没有简单的处理方案呢?答案是有的,对于这种功能统一,且使用的地方较多的功能,就可以考虑AOP来统一处理了。

除了统一的用户登录判断之外,AOP还可以实现:

  • 统一日志记录
  • 统一方法执行时间统计
  • 统一的返回格式设置
  • 统一的异常处理
  • 事务的开启和提交等

也就是说使用AOP可以扩充多个对象的某个能力,所以AOP可以说是OOP (Object OrientedProgramming,面向对象编程)的补充和完善。

3. Spring AOP 应该怎么学习呢?

Spring AOP学习主要分为以下3个部分:
1.学习AOP是如何组成的?也就是学习AOP组成的相关概念。
2.学习Spring AOP使用。
3.学习Spring AOP实现原理。下面我们分别来看。

3.1AOP组成

3.1.1 切面(Aspect)

切面(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包括了连接点的定义。

切面是包含了:通知、切点和切面的类,相当于AOP实现的某个功能的集合。

3.1.2 连接点(Join Point)

应用执行过程中能够插入切面的一个点,这个点可以是方法调用时,抛出异常时,甚至修改字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。

连接点相当于需要被增强的某个AOP功能的所有方法。

3.1.3 切点(Pointcut)

Pointcut是匹配Join Point的谓词。

Pointcut 的作用就是提供一组规则(使用AspectJ pointcut expression language来描述)来匹配Join Point,给满足规则的Join Point添加Advice。

切点相当于保存了众多连接点的一个集合(如果把切点看成一个表,而连接点就是表中一条一条的数据)。

3.1.4 通知(Advice)

切面也是有目标的——它必须完成的工作。在AOP术语中,切面的工作被称之为通知。
通知︰定义了切面是什么,何时使用,其描述了切面要完成的工作,还解决何时执行这个工作的问题。

Spring切面类中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后会通知本方法进行调用:

  • 前置通知使用@Before:通知方法会在目标方法调用之前执行。
  • 后置通知使用@After:通知方法会在目标方法返回或者抛出异常后调用。
  • 返回之后通知使用@AfterReturning:通知方法会在目标方法返回后调用。
  • 抛异常后通知使用@AfterThrowing:通知方法会在目标方法抛出异常后调用。
  • 环绕通知使用@Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。

切点相当于要增强的方法。
AOP整个组成部分的概念如下图所示,以多个页面都要访问用户登录权限为例:

3.2 Spring AOP实现

使用Spring AOP来实现一下AOP的功能,完成的目标是拦截所有UserController里面的方法,每次调用UserController中任意一个方法时,都执行相应的通知事件。

Spring AOP 的实现步骤是:

  • 添加 AOP 框架支持。
  • 定义切面和切点。
  • 定义通知。

3.2.1 添加 AOP 框架支持

3.2.2 定义切面和切点。

3.2.3 定义相关通知

通知定义的是被拦截的方法具体要执行的业务,比如用户登录权限验证方法就是具体要执行的业务Spring AOP中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后会通知本方法进行调用:

  • 前置通知使用@Before:通知方法会在目标方法调用之前执行。
  • 后置通知使用@After:通知方法会在目标方法返回或者抛出异常后调用。
  • 返回之后通知使用@AfterReturning:通知方法会在目标方法返回后调用。
  • 抛异常后通知使用@AfterThrowing:通知方法会在目标方法抛出异常后调用。
  • 环绕通知使用@Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。

具体实现如下:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class UserAspect {
    // 定义切点⽅法
    @Pointcut("execution(* com.example.demo.controller.UserController.*
(..))")
    public void pointcut(){ }
    // 前置通知
    @Before("pointcut()")
    public void doBefore(){
        System.out.println("执⾏ Before ⽅法");
    }
    // 后置通知
    @After("pointcut()")
    public void doAfter(){
        System.out.println("执⾏ After ⽅法");
    }
    // return 之前通知
    @AfterReturning("pointcut()")
    public void doAfterReturning(){
        System.out.println("执⾏ AfterReturning ⽅法");
    }
    // 抛出异常之前通知
    @AfterThrowing("pointcut()")
    public void doAfterThrowing(){
        System.out.println("执⾏ doAfterThrowing ⽅法");
    }

    // 添加环绕通知
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint){
        Object obj = null;
        System.out.println("Around ⽅法开始执⾏");
        try {
            // 执⾏拦截⽅法
           obj = joinPoint.proceed();
           } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("Around ⽅法结束执⾏");
        return obj;
    }
}

3.3 Spring AOP 实现原理

3.3.1 动态代理

Spring AOP是构建在动态代理基础上,因此Spring对AOP的支持局限于方法级别的拦截。

Spring AOP支持JDK ProxyCGLIB方式实现动态代理。默认情况下,实现了接口的类,使用AOP会基于JDK生成代理类,没有实现接口的类,会基于CGLIB生成代理类。

这两种方式的代理目标都是被代理类中的方法,在运行期,动态的织入字节码生成代理类

3.3.2 JDK和CGLIB实现的区别

  • JDK实现,要求被代理类必须实现接口,之后是通过InvocationHandlerProxy,在运行时动态的在内存中生成了代理类对象,该代理对象是通过实现同样的接口实现(类似静态代理接口实现的方式),只是该代理类是在运行期时,动态的织入统一的业务逻辑字节码来完成。
  • CGLIB实现,被代理类可以不实现接口,是通过继承被代理类,在运行时动态的生成代理类

3.3.3 织入(Weaving):代理的生成时机

织入是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织入到目标对象中。

在目标对象的生命周期里有多个点可以进行织入∶

  • 编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
  • 类加载器:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器 (ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-time weaving. LTW)就支持以这种方式织入切面。
  • 运行期:切面在应用运行的某一时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象。SpringAOP就是以这种方式织入切面的。

此种实现在设计模式上称为动态代理模式,在实现的技术手段上,都是在class代码运行期,动态的织入字节码生成代理类。

3.3.4 总结

AOP是对某方面能力的统一实现,它是一种实现思想,Spring AOP是对AOP的具体实现,SpringAOP可通过AspectJ(注解) 的方式来实现AOP的功能,Spring AOP 的实现步骤是:

  • 添加AOP框架支持。
  • 定义切面和切点。
  • 定义通知。

Spring AOP是通过动态代理的方式,在运行期将AOP代码织入到程序中的,它的实现方式有两种JDK Proxy和CGLIB。

4. SpringBoot 统一功能处理

接下来是Spring Boot统一功能处理模块了,也是AOP的实战环节,要实现的课程目标有以下3个:

  • 统一用户登录权限验证;
  • 统—数据格式返回;
  • 统一异常处理。

接下我们一个一个来看。

4.1 用户登录权限效验

用户登录权限的发展从之前每个方法中自己验证用户登录权限,到现在统一的用户登录验证处理,它是—个逐渐完善和逐渐优化的过程。

4.1.1 Spring拦截器

Spring 中提供了具体的实现拦截器:HandlerInterceptor,

统一用户登录权限的效验使用WebMvcConfigurer + HandlerInterceptor来实现。

拦截器的实现分为以下两个步骤∶

  • 创建自定义拦截器,实现 HandlerInterceptor接口的preHandle (执行具体方法之前的预处理)方法。
  • 将自定义拦截器加入 WebMvcConfigurer的addInterceptors方法中。具体实现如下。

4.1.2 自定义拦截器

接下来使用代码来实现一个用户登录的权限效验,自定义拦截器是一个普通类,具体实现代码如下

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute("userinfo") != null) {
            return true;
        }
        response.setStatus(401);
        return false;
    }
}

4.1.3 将自定义拦截器加入到系统配置

将上一步中的自定义拦截器加入到系统配置信息中,具体实现代码如下:

@Configuration
public class AppConfig implements WebMvcConfigurer {
    // 添加拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**") // 拦截所有接⼝
                .excludePathPatterns("/art/param11"); // 排除接⼝
    }
}

其中:

  • addPathPatterns:表示需要拦截的URL,“**”表示拦截任意方法(也就是所有方法)。
  • excludePathPatterns:表示需要排除的URL。

说明:以上拦截规则可以拦截此项目中的使用URL,包括静态文件(图片文件、JS和CSS等文件
排除所有的静态资源

// 拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LoginInterceptor())
        .addPathPatterns("/**") // 拦截所有接⼝
        .excludePathPatterns("/**/*.js")
        .excludePathPatterns("/**/*.css")
        .excludePathPatterns("/**/*.jpg")
        .excludePathPatterns("/login.html")
        .excludePathPatterns("/**/login"); // 排除接⼝
}

4.1.4 拦截器实现原理

正常情况下的调用顺序:

然而有了拦截器之后,会在调用Controller 之前进行相应的业务处理,执行的流程如下图所示:

4.1.5 拦截器小结

通过上面的源码分析,我们可以看出,Spring 中的拦截器也是通过动态代理环绕通知的思想实现的大体的调用流程如下:

4.1.6 扩展:统⼀访问前缀添加

所有请求地址添加 api 前缀:

@Configuration
public class AppConfig implements WebMvcConfigurer {
    // 所有的接⼝添加 api 前缀
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("api", c -> true);
    }
}

@Configuration
public class AppConfig implements WebMvcConfigurer {
    // 所有的接⼝添加 api 前缀
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("api", c -> true);
    }
}

其中第二个参数是⼀个表达式,设置为 true 表示启动前缀。

4.2 统一异常处理

统一异常处理使用的是 @ControllerAdvice + @ExceptionHandler 来实现的,
@ControllerAdvice表示控制器通知类,@ExceptionHandler是异常处理器,两个结合表示当出现异常的时候执行某个通知就是执行某个方法事件,具体实现代码如下:

import java.util.HashMap;

@ControllerAdvice
public class ErrorAdive {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object handler(Exception e) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("success", 0);
        map.put("status", 1);
        map.put("msg", e.getMessage());
        return map;
    }
}

PS:方法名和返回值可以自定义,其中最重要的是@ExceptionHandler(Exception.class)注解.

以上方法表示,如果出现了异常就返回给前端一个HashMap的对象,其中包含的字段如代码中定义的那样。
我们可以针对不同的异常,返回不同的结果,比以下代码所示:

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;

@ControllerAdvice
@ResponseBody
public class ExceptionAdvice {
    @ExceptionHandler(Exception.class)
    public Object exceptionAdvice(Exception e) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("success", -1);
        result.put("message", "总的异常信息:" + e.getMessage());
        result.put("data", null);
        return result;
    }
    @ExceptionHandler(NullPointerException.class)
    public Object nullPointerexceptionAdvice(NullPointerException e) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("success", -1);
        result.put("message", "空指针异常:" + e.getMessage());
        result.put("data", null);
        return result;
    }
}

当有多个异常通知时,匹配顺序为当前类及其子类向上依次匹配,案例演示。在UserController中设置一个空指针异常,实现代码如下:

@RestController
@RequestMapping("/u")
public class UserController {
    @RequestMapping("/index")
    public String index() {
        Object obj = null;
        int i = obj.hashCode();
        return "Hello,User Index.";
    }
}

以上程序的执行结果如下:

4.2 统一数据返回格式

4.2.1 为什么需要统一数据返回格式?

统一数据返回格式的优点有很多,比如以下几个:

  • 方便前端程序员更好的接收和解析后端数据接口返回的数据。
  • 降低前端程序员和后端程序员的沟通成本,这按照某个格式实现就行了,因为所有接口都是这样返回的。
  • 有利于项目统—数据的维护和修改。
  • 有利于后端技术部门的统一规范的标准制定,不会出现稀奇古怪的返回内容。

4.2.2 统一数据返回格式的实现

统一的数据返回格式可以使用
@ControllerAdvice + ResponseBodyAdvice 的方式实现,具体实现代码如下:

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import java.util.HashMap;
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    /**
     * 内容是否需要重写(通过此⽅法可以选择性部分控制器和⽅法进⾏重写)
     * 返回 true 表示重写
     */
    @Override
    public boolean supports(MethodParameter returnType, Class
converterType) {
        return true;
    }
    /**
     * ⽅法返回之前调⽤此⽅法
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter
		returnType, MediaType selectedContentType, Class selectedConverterType,
		ServerHttpRequest request, ServerHttpResponse response) {
        // 构造统⼀返回对象
        HashMap<String, Object> result = new HashMap<>();
        result.put("success", 1);
        result.put("message", "");
        result.put("data", body);
        return result;
    }
}

总结

  • 统一用户登录权限的效验使用WebMvcConfigurer + HandlerInterceptor来实现,
  • 统一异常处理使用 @ControllerAdvice + @ExceptionHandler 来实现,
  • 统一返回值处理使用 @ControllerAdvice + ResponseBodyAdvice 来处理。

到此这篇关于Spring AOP统一功能处理的文章就介绍到这了,更多相关Spring AOP用户登陆统一验证内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring AOP实现声明式事务机制源码解析

    目录 一.声明式全局事务 二.源码 三.小结: 一.声明式全局事务 在Seata示例工程中,能看到@GlobalTransactional,如下方法示例: @GlobalTransactional public boolean purchase(long accountId, long stockId, long quantity) { String xid = RootContext.getXID(); LOGGER.info("New Transaction Begins: " +

  • Spring AOP与AspectJ的对比及应用详解

    目录 1 简介 2 Spring AOP vs AspectJ 2.1 织入方式 2.2 Joinpoints 2.3 性能 3 Spring Boot使用AspectJ 3.1 引入依赖 3.2 被AOP的对象 3.3 配置Aspect 3.4 maven插件 3.5 执行及测试 3.6 一些遇到的错误 4 总结 1 简介 AOP,即面向切面编程是很常用的技术,特别是在Java Web开发中.而最流行的AOP框架分别是Spring AOP和AspectJ. 2 Spring AOP vs As

  • Spring AOP如何自定义注解实现审计或日志记录(完整代码)

    目录 环境准备 项目结构 自定义审计注解 定义切面类 定义返回值处理基类 定义返回值处理子类 定义功能模块类 定义操作类 定义审计信息实体类 书写mapper文件 开启AOP拦截 注解配置 总结 环境准备 JDK 1.8,Springboot 2.1.3.RELEASE,spring-boot-starter-aop.2.1.4.RELEASE.jar,aspectjrt.1.9.2.jar,aspectjweaver.1.9.2.jar,pom依赖如下: <!-- 添加aspectj -->

  • Spring使用AOP完成统一结果封装实例demo

    目录 Spring使用AOP完成统一结果封装 Demo实现 Spring使用AOP完成统一结果封装 起因:自己写项目的时候忍受不了每个方法都要写一个retrun Result.success();和 retrun Result.error();,同时想到项目运行时异常的统一捕捉处理,于是我就在想有没有一种方法能够快捷有效的实现统一返回结果格式的方法.同时也能够比较方便的设置各种参数方便使用,于是我就想到AOP. Demo实现 引入依赖 <dependency> <groupId>o

  • Spring AOP源码深入分析

    目录 1. 前言 2. 术语 3. 示例 4. @EnableAspectJAutoProxy 5. AbstractAutoProxyCreator 6. 构建Advisor 7. 创建代理对象 8. DynamicAdvisedInterceptor 9. CglibMethodInvocation 10. Advice子类 1. 前言 Spring除了IOC和DI,还有另一个杀手锏功能——Spring AOP.AOP是一种面向切面的编程思想,它的关注点是横向的,不同于OOP的纵向.面向对象

  • Spring AOP的概念与实现过程详解

    目录 Aop 实现aop方式一 实现aop方式二 注解实现aop Aop 什么是Aop? AOP就是面向切面编程,通过预编译方式以及运行期间的动态代理技术来实现程序的统一维护功能. 什么是切面,我理解的切面就是两个方法之间,两个对象之间,两个模块之间就是一个切面.假设在两个模块之间需要共同执行一系列操作,并且最后将这一系列操作注入到两个模块之间的指定位置.此时这一系列操作就是切面,注入这些操作的位置称之为切点. 举例:公司员工上班 A员工上班需要在前台进行打卡,同样的B员工…其他员工都需要在前台

  • SpringBoot使用AOP与注解实现请求参数自动填充流程详解

    首先定义一个加在方法上的注解 import java.lang.annotation.*; /** * 开启自动参数填充 */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) @Documented @Inherited public @interface AutoParameterFill { /** * 要填充的字段名,不写的话默认下面类的子类中的字段都要填充 * * @see AutoParameterFi

  • Spring AOP统一功能处理示例代码

    目录 1. 什么是Spring AOP? 2. 为什要用 AOP? 3. Spring AOP 应该怎么学习呢? 3.1AOP组成 3.1.1 切面(Aspect) 3.1.2 连接点(Join Point) 3.1.3 切点(Pointcut) 3.1.4 通知(Advice) 3.2 Spring AOP实现 3.2.1 添加 AOP 框架支持 3.2.2 定义切面和切点. 3.2.3 定义相关通知 3.3 Spring AOP 实现原理 3.3.1 动态代理 3.3.2 JDK和CGLIB

  • 基于Spring Data的AuditorAware审计功能的示例代码

    Spring Data提供支持审计功能:即由谁在什么时候创建或修改实体.Spring Data提供了在实体类的属性上增加@CreatedBy,@LastModifiedBy,@CreatedDate,@LastModifiedDate注解,并配置相应的配置项,即可实现审计功能,有系统自动记录 createdBy CreatedDate lastModifiedBy lastModifiedDate 四个属性的值,下面为具体的配置项. 示例 创建一个实体类 package com.hfcsbc.i

  • Java spring boot 实现支付宝支付功能的示例代码

    一.准备工作: 1.登陆支付宝开发者中心,申请一个开发者账号. 地址:https://openhome.alipay.com/ 2.进入研发服务: 3.点击链接进入工具下载页面: 4.点击下载对应版本的RSA公钥生成器: 5.生成公钥密钥(记录你的应用私钥): 6.在支付宝配置公钥(点击保存): 二.搭建demo 1.引入jia包: <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alip

  • Spring boot+mybatis+thymeleaf 实现登录注册增删改查功能的示例代码

    本文重在实现理解,过滤器,业务,逻辑需求,样式请无视.. 项目结构如下 1.idea新建Spring boot项目,在pom中加上thymeleaf和mybatis支持.pom.xml代码如下 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3

  • 使用spring aop 统一捕获异常和写日志的示例demo

    之前给大家介绍过Spring AOP的基础知识,需要的朋友点击了解下吧,这边我将给您介绍用spring AOP 实现的异常捕获和日志的小demo,我也会详细解释相关配置. 首先给大家看一下我的工程目录: 大家可以先用eclipse中新建一个maven工程,在工程中pom.xml按下面文件添加依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XM

  • springboot整合@Retryable实现重试功能的示例代码

    目录 前言 @Retryable 简介 使用步骤 1.引入依赖 2.启用@Retryable 3.添加@Retryable注解 4.测试 注意事项 最后 结语 前言 在实际工作中,重试机制是一个很常见的场景,比如:发送消息失败,下载网络文件失败等…,因为这些错误可能是网络波动造成的,等待一些延迟就能成功处理.我们通常会使用try/catch.while循环等进行相关处理,但是这样看起来比较臃肿复杂,且不好看.于是就有了spring提供的重试模块—— @Retryable @Retryable 简

  • spring boot整合Swagger2的示例代码

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步.Swagger 让部署管理和使用功能强大的API从未如此简单. 1.代码示例 1).在pom.xml文件中引入Swagger2 <dependency> <groupId>io.springfox</groupId> <artifa

  • IDEA 中创建Spring Data Jpa 项目的示例代码

    一.IDEA 创建工程 使用IDEA 创建工程的过程,使用文字做简单描述. 选择工程类别[Spring Initializr]. 设置工程的元数据[Metadata],根据自己的情况填写即可. 设置工程的依赖:在[Web]中选择"Spring Web";在[SQL]中选中"Spring Data JPA"."Spring Data JDBC"."MySQL Driver"."JDBC API".选中的可能有

  • MyBatis Plus 实现多表分页查询功能的示例代码

    在Mybatis Plus 中,虽然IService 接口帮我们定义了很多常用的方法,但这些都是 T 对象有用,如果涉及到 多表的查询,还是需要自定义Vo 对象和自己编写sql 语句,Mybatis Plus提供了一个Page 对象,查询是需要设置其中的 size 字段 和 current 字段的值 一.分页配置 可以直接使用selectPage这样的分页,但返回的数据确实是分页后的数据,但在控制台打印的SQL语句其实并没有真正的物理分页,而是通过缓存来获得全部数据中再进行的分页,这样对于大数据

  • Mybatis Plus 自定义方法实现分页功能的示例代码

    一般物理分页,即通过sql语句分页,都是在sql语句后面添加limit分页语句,在xml文件里传入分页的参数,再多配置一条sql,用于查询总数: <select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper"> select * from student limit #{currIndex} , #{pageSize} </select&

随机推荐