乐趣区

关于spring:Spring5学习4AOP概念

1. 什么是 AOP
面向切面编程

AOP 底层应用动静代理
(1)有接口状况【应用 JDK 动静代理】

创立代理对象
要想创立一个代理对象,须要应用 Proxy 类的 newProxyInstance 办法。这个办法有三个参数:

  • 一个类加载器(class loader)。
  • 一个 Class 对象数组,每个元素都是须要实现的接口。
  • 一个调用处理器

(2)无接口状况【应用 CGLIB 动静代理】

AOP 术语
(1)连接点:能够被加强的办法就是连接点
(2)切入点:理论被加强的办法就是切入点
(3)告诉【加强】:理论加强办法中加强的局部

  - 前置告诉
  - 后置告诉
  - 盘绕告诉
  - 异样告诉
  - 最终告诉

(4)切面:

应用 AspectJ 进行 AOP 操作
execution(权限修饰符 返回类型 类全门路 办法名称(参数列表))

(1)创立类

@Component
public class User {public void add(){System.out.println("add...");
    }
    
}

(2)创立加强类

@Component
@Aspect
public class UserProxy {

    // 前置告诉
    @Before(value = "execution(* com.example.demo.entity.User.add())")
    public void before(){System.out.println("before...");
    }

    // 最终告诉[有没有异样都会执行]
    @After(value = "execution(* com.example.demo.entity.User.add())")
    public void after(){System.out.println("after...");
    }

    // 后置告诉
    @AfterReturning(value = "execution(* com.example.demo.entity.User.add())")
    public void afterReturing(){System.out.println("afterReturning...");
    }

    // 异样告诉
    @AfterThrowing(value = "execution(* com.example.demo.entity.User.add())")
    public void afterThrowing(){System.out.println("afterThrowing...");
    }

    // 盘绕告诉
    @Around(value = "execution(* com.example.demo.entity.User.add())")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("around before...");
        proceedingJoinPoint.proceed();
        System.out.println("around after...");
    }

}

(3)进行告诉的配置

 1. 在 Spring 配置文件中,开启注解开发
 2. 应用注解创立 User 和 UserProxy 对象
 3. 在加强类下面增加注解 @Aspect
 4. 在 Spring 配置文件中开启生成代理对象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

       <!-- 开启注解扫描 -->
       <context:component-scan base-package="com.example.demo.entity"></context:component-scan>

       <!-- 开启 Aspect 生成代理对象 -->
       <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>

(4)公共切入点抽取

    @Pointcut(value = "execution(* com.example.demo.entity.User.add())")
    public void point(){}

    // 前置告诉
    @Before(value = "point()")
    public void before(){System.out.println("before...");
    }

(5)加强类优先级【多个加强类对同一办法进行加强】

 加强类上增加注解 @Order(数字类型值),数字值越小优先级越高
退出移动版