Spring Aop组成部分

Spring Aop

(Aspect orirnted Programming)面向切面编程,是对面向对象编程的一种补充,是一种编程思想,是对某一类的事情的集中处理。

比如用户登录状态的验证状态,在之前写servlet版本的博客系统,这里就有一个登录验证而且是在每一个页面都添加了一个登录验证,在使用Aop后,只需要写一个类就可以解决这个问题。

Aop组成

  1. 切面(Aspect

    定义的是事件,Aop实现了某个功能的集合。

    ex:用户登录校验

  2. 切点(Pointcut

    定义事件的规则。

    ex:定义用户登录拦截规则,那些接口判断用户登录权限

  3. 通知(Advice

    AOP具体的执行方法。

    • 前置通知
    • 后置通知
    • 环绕通知
    • 异常通知
    • 返回通知

    ex:获取用户登录信息,如果已经获取说明已经是登陆状态,否则未登录。

  4. 链接点(Jion Poit

    有可能触发切点的所有点,这个点可以是方法调用,也可以是抛出异常或者是修改字段。

    ex:所有接口

实现AOP步骤:

  1. 添加依赖

    properties 复制代码
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
  2. 定义切面

    java 复制代码
    @Aspect //定义切面
    @Component
    public class UserAspect {
        
    }
  3. 定义切点

    java 复制代码
    @Aspect //定义切面
    @Component
    public class UserAspect {
        @Pointcut("execution(* com.example.demo.controller.UserController.*(..)))")
        //空方法,主要是一个标识作用
        public void pointcut(){}
    }

    定义目录语法格式是AspectJ支持三种通配符

    *:匹配任意字符,只可以匹配一个元素。

    ..:匹配任意字符,可以匹配多个元素,表示类时,必须和*联合使用。

    +:表示按照类型匹配指定所有类,必须跟在类的后面。如:com.java.Car+表示继承该类的所有方法

  4. 通知

    具体实现方法

    java 复制代码
    @RestController
    @RequestMapping("/user")
    public class UserController {
        @RequestMapping("/grtUser")
        public String getUser(){
            System.out.println("do getUser");
            return "get User";
        }
        @RequestMapping("/delUser")
        public String delUser(){
            System.out.println("do delUser");
            return "delUser";
        }
    }

    实现通知

    java 复制代码
    @Aspect //定义切面
    @Component
    public class UserAspect {
        @Pointcut("execution(* com.example.demo.controller.UserController.*(..)))")//切点,括号中填写目录名称,在执行时会自动扫描方法,这⾥使⽤ AspectJ 表达式语法
        public void pointcut(){
    		//目标方法,这⾥是空方法,主要是一个标识作用
        }
        //前置通知
        @Before("pointcut()")
        public void doBefore(){
            System.out.println("执行了前置通知");
        }
        //后置通知
        @After("pointcut()")
        public void doAfter(){
            System.out.println("执行了后置通知");
        }
        //环绕通知
        @Around("pointcut()")
        public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("环绕通知之前");
            //执行目标方法
            Object object = joinPoint.proceed();
            System.out.println("环绕通知之后");
            return object;
        }
        @AfterReturning("pointcut()")
        public void doAfterReturning(){
            System.out.println("执行了返回方法");
        }
        @AfterThrowing("pointcut()")
        public void doAfterThrowing(){
            System.out.println("执行了抛出异常方法");
        }
    }

    四种通知方法:

    前置通知:在执行方法之前执行的方法

    后置通知:在执行完前面所有方法之后执行

    环绕通知:通知包裹内被通知的方法,在被通知的方法之后和调用之前执行的自定义的行为。

    返回通知:通知方法会在目标方法返回之后执行

    异常通知:通知方法会在目标方法抛出异常后执行

AOP动态代理(实现原理)

Spring 动态代理组成:

JDK Proxy ------》 代理对象必须实现接口,才可以使用 JDK Proxy

CGLIB ------》通过实现代理类的子类来实现动态代理------》注意:被final修饰的类是不能被代理的

课件

两个代理区别

  1. 来源不同 :JDK来源于Java本地资源,CGLib是第三方资源
  2. 实现不同 :JDK proxy 需要代理类实现接口才可以实现代理 CGLIB是通过实现代理类的子类来完成动态代理
  3. 性能不同 : JDK 7+ JDK proxy 性能高与CGlib 。
相关推荐
三8449 分钟前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker
暮雨哀尘35 分钟前
Java 基础练习(一):创建类并调用对象
java·开发语言
wing981 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
想要入门的程序猿1 小时前
回调函数学习
java·网络·学习
EatFan1 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
泡海椒1 小时前
动态代理核心原理:JQuick-Java接口规则自动生成机制解析
java·开发语言·python
步行cgn1 小时前
Spring 启动报错:BeanFactory not initialized 的原因与解决
java·python·spring
步行cgn1 小时前
Spring 报错:No bean class specified on bean definition 的原因与解决
java·后端·spring
凤山老林1 小时前
Spring Boot 整合 Flowable 的企业级落地指南
数据库·spring boot·后端·flowable·工作流
苏三说技术2 小时前
Kafka已正式接入AI
后端