springboot切面编程基础实践

简介: springboot切面编程基础实践

一、引入依赖

web和aop是必须的,fastjson只是为了输出方便;

<!--        web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        切面依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
<!--        json工具包-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.79</version>
        </dependency>

二、定义切面

定义步骤:

(1)、切面类加@Aspect 、@Service注解,告诉springboot这是一个切面类,帮我管起来;

(2)、定义切点@Pointcut;

(3)、定义切入点切入的时机及完成的功能(@Around、@Before、@After、@AfterReturning、@AfterThrowing);

1.基于注解拦截

注解:@PermissionAnnotation

@Service
@Aspect
public class PermissionFirstAdvice {
    @Pointcut("@annotation(com.example.demo.anot.PermissionAnnotation)")
    private void permissionCheck() {
    }
 
    @Around("permissionCheck()")
    public Object permissionCheckFirst(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("第一个切面"); 
        return joinPoint.proceed();
    }
}
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PermissionAnnotation {
}

其中joinPoint.proceed()执行目标方法,如果没有调用,则不执行目标方法

proceed传参数的方法可以动态的改变传入目标方法的参数,

 

 2.基于表达式拦截

表达式:* com.example.demo.controller..*.*(..)

第一个 * 号的位置:表示返回值类型,* 表示所有类型。

包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,在本例中指 com.example.demo.controller.包、子包下所有类的方法。

第二个 * 号的位置:表示类名,* 表示所有类。

*(..):这个星号表示方法名,* 表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。

@Component
@Aspect
public class ControllerAdvice {
    @Pointcut("execution(* com.example.demo.controller..*.*(..))")
    public void chtrollerPict(){
    }
    @Around("chtrollerPict()")
    public Object permissionCheckFirst(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("controllerAdvice"); 
        return joinPoint.proceed();
    }
}

3、切点多个表达式或注解

多个表达式之间使用 ||,or表示 或,使用 &&,and表示 与,!表示 非

 @Pointcut("execution(* com.example.demo.controller..*.*(..))||@annotation(com.example.demo.anot.PermissionAnnotation)")

三、测试

同时满足上述两个切点条件(注解和controller包),如需改变连个切入点的执行顺讯,再切面类上加@Order(0)注解,数字越小,执行越靠前

package com.example.demo.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.anot.PermissionAnnotation;
import org.springframework.web.bind.annotation.*;
 
@RestController
@RequestMapping(value = "/permission")
public class TestController {
    @RequestMapping(value = "/check", method = RequestMethod.POST)
    @PermissionAnnotation
    public JSONObject getGroupList(@RequestBody JSONObject request) {
        System.out.println("方法执行");
        return JSON.parseObject("{\"message\":\"SUCCESS\",\"code\":200}");
    }
}


目录
相关文章
|
11天前
|
XML Java UED
使用 Spring Boot 实现重试和补偿功能:从理论到实践
【6月更文挑战第17天】在分布式系统中,服务之间的调用可能会因为网络故障、服务器负载等原因偶尔失败。为了提高系统的可靠性和稳定性,我们经常需要实现重试和补偿功能。
37 6
|
9天前
|
XML 缓存 Java
Spring Boot 优雅实现降级功能:Hystrix 与 Resilience4j 的实践
【6月更文挑战第19天】在分布式系统中,服务降级是一种重要的容错机制。当某个服务不可用或响应慢时,降级机制可以保证系统的整体稳定性。本文将详细介绍如何在 Spring Boot 中使用 Hystrix 和 Resilience4j 实现降级功能。
39 7
|
10天前
|
NoSQL 算法 Java
使用 Spring Boot 实现限流功能:从理论到实践
【6月更文挑战第18天】在微服务和高并发系统中,限流(Rate Limiting)是一种非常重要的技术手段,用于保护系统免受过载,确保服务的稳定性。限流可以控制请求的速率,防止单个客户端或恶意用户消耗过多的资源,从而影响其他用户。
16 5
|
21天前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp微信小程序的“返家乡”高校暑期社会实践微信小程序的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的“返家乡”高校暑期社会实践微信小程序的详细设计和实现
14 1
|
1月前
|
JavaScript Java 测试技术
基于springboot+vue.js的编程训练系统附带文章和源代码设计说明文档ppt
基于springboot+vue.js的编程训练系统附带文章和源代码设计说明文档ppt
32 11
|
28天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的少儿编程在线培训系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的少儿编程在线培训系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
28天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的程序设计实践项目管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的程序设计实践项目管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
9天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的“返家乡”高校暑期社会实践微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的“返家乡”高校暑期社会实践微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
|
1月前
|
Java API 网络架构
利用Java Spring Boot构建微服务架构的实践探索
随着业务复杂性的增长和互联网技术的飞速发展,微服务架构已成为现代软件开发中不可或缺的一部分。本文旨在探讨如何利用Java Spring Boot框架构建微服务架构,包括微服务的定义、优势,以及通过实际案例展示如何设计、开发和部署微服务。我们将关注服务拆分、服务间通信、数据一致性、服务治理等核心问题,并探讨如何结合Spring Cloud生态中的组件来实现高效、可靠的微服务架构。
|
1月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的编程训练系统的设计与实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的编程训练系统的设计与实现(源码+lw+部署文档+讲解等)