AOP(概念和原理)

news2024/11/18 19:29:26

文章目录

  • 1. AOP(概念)
  • 2. AOP(底层原理)
    • 2.1 AOP底层使用动态代理(两种)
    • 2.2 AOP 底层使用哪种代理方式 ?
  • 3. AOP相关概念
    • 3.1 AOP术语
  • 4. AOP操作
    • 4.1 基于AspectJ实现AOP操作
    • 4.2 切点表达式
    • 4.3 基于AspectJ注解
    • 4.4 基于AspectJ配置文件实现

1. AOP(概念)

  • 面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率。
  • 通俗描述:不通过修改源码的方式,在主干功能里面添加新功能

2. AOP(底层原理)

2.1 AOP底层使用动态代理(两种)

  • JDK动态代理(基于接口的动态代理技术,使用Proxy类(java.lang.reflect.Proxy ))
    调用newProxyInstance方法
static ObjectnewProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)
返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。

参数一:目标对象类加载器
参数二:目标对象相同的接口字节码对象数组
参数三:实现这个接口InvocationHandler,创建代理对象,写增强方法

  • cglib动态代理(基于父类的动态代理技术)
//目标对象
final Target target=new Target();
 
//返回值就是动态生成的代理对象    基于cglib
//1 创建增强器
Enhancer enhancer=new Enhancer();
//2 设置父类(目标)
enhancer.setSuperclass(Target.class);
//3 设置回调
enhancer.setCallback(new MethodInterceptor() {
   public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
      System.out.println("执行前的方法");//执行前置
      Object invoke = method.invoke(target, args);//执行目标
      System.out.println("执行后的方法");//执行后置
      return invoke;
      }
});
//4 创建代理对象
Target proxy  = (Target) enhancer.create();

2.2 AOP 底层使用哪种代理方式 ?

在 spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式

3. AOP相关概念

3.1 AOP术语

  • 连接点:类里面有哪些方法可以被增强,这些方法被称为连接点。
  • 切点:实际真正被真正增强的方法,成为切点。
  • 通知(增强):实际增强的逻辑部分称为通知。
    前置通知、后置通知、环绕通知、异常通知、最终通知
前置通知@Before用于配置前置通知。指定增强的方法在切入点方法之前执行
后置通知@AfterReturning用于配置后置通知。指定增强的方法在切入点方法之后执行
环绕通知@Around用于配置环绕通知。指定增强的方法在切入点方法之前和之后都执行
异常抛出通知@AfterThrowing用于配置异常抛出通知。指定增强的方法在出现异常时执行
最终通知@After用于配置最终通知。无论增强方式执行是否有异常都会执行
  • 切面:把通知应用到切入点的过程。

4. AOP操作

4.1 基于AspectJ实现AOP操作

AspectJ不是Spring组成部分,独立AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作

4.2 切点表达式

  • 切入点表达式作用:知道对哪个类里面的哪些方法进行增强
  • 语法结构:
    execution([修饰符] 返回值类型 包名.类名.方法名(参数))
    访问修饰符可以省略
    返回值类型、包名、类名、方法名可以 使用星号* 代表任意
    包名与类名之间一个点 . 代表当前包下的类,两个点 … 表示当前包及其子包下的类
    参数列表可以使用两个点 … 表示任意个数,任意类型的参数列表
//举例
execution(public void com.xxx.aop.Target.method())	
execution(void com.xxx.aop.Target.*(..))  //Target类下所有方法
execution(* com.xxx.aop.*.*(..))  //aop当前包所有类所有方法
execution(* com.xxx.aop..*.*(..)) //aop当前包及子包所有类所有方法

4.3 基于AspectJ注解

  • 创建类,在类里面定义方法
@Component
public class User {
    public void add(){
        System.out.println("add...");
    }
}
  • 创建增强类(编写增强逻辑)
@Component
public class UserProxy {
    public void before(){
        System.out.println("before");
    }
}
  • 进行通知的配置
    • 在spring配置文件中,开启注解扫描
      <context:component-scan base-package="aop"/>
      
    • 在增强类上面添加@Aspect并配置通知
      @Component
      @Aspect  //生成代理对象
      public class UserProxy {
          @Pointcut("execution(* aop.User.add(..))")  //提取切点表达式
          public void myPoint(){}
       
          @Before(value = "UserProxy.myPoint()")
          public void before(){
              System.out.println("before");
          }
       
          @Around("UserProxy.MyPoint()")
          public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
              System.out.println("环绕之前...");
              //被增强方法执行
              proceedingJoinPoint.proceed();
              System.out.println("环绕之后...");
          }
      }
      
    • 在spring配置文件中开启生成代理对象(自动代理)
      <aop:aspectj-autoproxy/>
      
    注意:多个增强类增强统一个方法,设置增强优先级(增强类上添加@Order(数字类型值)值越小优先级越高)

4.4 基于AspectJ配置文件实现

  • 创建两个类,增强类和被增强类,创建方法
  • 在spring配置文件中创建两个类对象的bean
  • 在spring配置文件中配置切入点
<aop:config>
  <!--配置切点-->
   <aop:pointcut id="p" expression="execution(* zsh.aopxml.Book.buy(..))"/>
   <!--配置切面-->
   <aop:aspect ref="bookProxy">
   <!--增强作用在具体的方法上-->
       <aop:before method="before" pointcut-ref="p"/>
   </aop:aspect>
</aop:config>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6 分布式事务简介

分布式事务简介 概念 基础概念&#xff1a;事务ACID * A&#xff08;Atomic&#xff09;&#xff1a;原子性&#xff0c;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部不执行&#xff0c;不可能出现部分成功部分失 败的情况。 * C&#xff08;Consisten…

嵌入式和Python(一):python环境搭建的详细步骤

目录 ● 安装python ① 更新软件列表 ② 安装编译python需要用到的环境 ③ 下载python源码 ④ 解压源码包 ⑤ 配置 ⑥ 编译 ⑦ 安装 ● 建立软连接 说明 ① 删除原来的软连接 ② 在/usr/bin/目录创建软连接python&#xff0c;定向/usr/local/bin/python3.9 ③ 检查…

Java面向对象:多态特性的学习

本文介绍了Java面向对象多态特性, 多态的介绍. 多态的实现条件–1.发生继承.2.发生重写(重写与重载的区别)3.向上转型与向下转型.4.静态绑定和动态绑定5. 实现多态 举例总结多态的优缺点 避免在构造方法内调用被重写的方法… Java面向对象:多态特性的学习一.什么是多态?二.多态…

MATLAB | 如何将colormap中心点置为0值处?

本期讲有一些绘图时正负部分需要分开赋予颜色&#xff0c;这时候双向colormap的中心对应的可能并不是数值0&#xff0c;该咋办&#xff0c;就比如下面的情况&#xff1a; 事先说明&#xff0c;为了绘图好看&#xff0c;本文中全部示例都在代码最后用了以下这个简单函数进行修饰…

库到底是个啥?为啥要链接,链接库的本质又是个啥?

目录 前言 一、库是个啥&#xff1f; ①最开始的库是用来解决啥问题&#xff1f; ②库的基本构成 ③动态库与静态库 二、如何生成库 0、相关知识 ①生成静态库 ②生成动态库 三、库的使用 ①修改环境变量 ②拷贝.so文件到系统共享库路径下, 一般指/usr/lib ③ldconfig 配置/etc…

安卓逆向_6 --- JNI 和 NDK

Java 本机接口规范内容&#xff1a;https://docs.oracle.com/en/java/javase/19/docs/specs/jni/index.html JNI官方中文资料&#xff1a;https://blog.csdn.net/yishifu/article/details/52180448 NDK 官方文档&#xff1a;https://developer.android.google.cn/training/ar…

【Python学习笔记】第二十八节 Python random 模块

一、Python random简介Python random 模块主要用于生成随机数。大部分python人都会用&#xff0c;但是一般人都是使用randint()帮我们生成某个范围的整数&#xff0c;但其实random模块还有很多非常使用的功能供我们使用&#xff0c;接下来我们就一一了解一下我们的random。要使…

JavaWeb系列之tomcat 服务器安装

文章目录一、JavaWeb应用程序架构B/S 架构C/S 架构B/S 与 C/S 对比MVC设计模式二、MVCMVC 开发项目搭建Web 服务器tomcat 服务器Idea 集成 tomcat第一个 JavaWeb 项目三、JSP 技术jsp 与 servlet 联系与区别一、JavaWeb 简介 JavaWeb 可以理解成使用 java 进行应用程序开发&am…

Windows-jdk8/jdk16安装

Windows-JAVA jdk-8安装教程 下载地址 百度网盘 提取码&#xff1a;Chen 官网 安装jdk8 双击打开下载的安装包 点击下一步 更改安装目录 点击下一步 修改Java安装目录 点击下一步 完成 配置环境变量 按住WindowsR 打开运行窗口 输入 sysdm.cpl 打开系统属性——》高级—…

华为机试题:HJ102 字符统计(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

【Redis】Redis分片集群

【Redis】Redis分片集群 文章目录【Redis】Redis分片集群1. 搭建分片集群1.1 分片集群结构1.2 搭建分片集群1.2.1 集群结构1.2.2 准备实例和配置1.2.3 启动1.2.4 创建集群1.2.5 测试2. 散列插槽2.1 总结3. 集群伸缩4. 故障转移4.1 数据迁移5. RedisTemplate访问分片集群1. 搭建…

GEE开发之ERA5(气温、降水、压力、风速等)数据获取和分析

GEE开发之ERA5&#xff08;气温、降水、压力、风速等&#xff09;数据获取和分析1.ERA5介绍2.初始ERA5数据2.1 DAILY代码2.2 MONTHLY代码3.遥感影像查看&#xff08;DAILY之mean_2m_air_temperature&#xff09;4.逐日数据分析和获取(以mean_2m_air_temperature为例)5.逐月数据…

【Storm】【二】Storm和流处理简介

Storm和流处理简介 一、Storm1.1 简介1.2 Storm 与 Hadoop对比1.3 Storm 与 Spark Streaming对比1.4 Storm 与 Flink对比二、流处理2.1 静态数据处理2.2 流处理一、Storm 1.1 简介 Storm 是一个开源的分布式实时计算框架&#xff0c;可以以简单、可靠的方式进行大数据流的处理…

基于 explore_lite包 的单个机器人自主探索建图

文章目录一、简介二、安装 explore_lite三、launch 文件配置四、实验效果五、常见问题机器人自主建图有很多方式&#xff0c;比如基于位置边界的map-explore&#xff0c;基于快速搜索树的rrt-explore&#xff0c;指定区域自主探索建图frontier-explore&#xff0c;这几种方法各…

SQL速查

学习自C语言中文网SQL教程笔记&#xff0c;该笔记为速查笔记&#xff0c;学习还是看原教程文章&#xff1a;http://c.biancheng.net/sql/ SQL命令 SQL 是关系型数据库的标准语言&#xff0c;SQL关键字不区分大小写 SQL语句分为以下三种类型&#xff1a; DML: Data Manipulat…

中国不缺高端产品,缺的只是高端服务

作者 | 曾响铃 文 | 响铃说 最近&#xff0c;响铃受邀参加了讯飞智能办公本莫比俱乐部在广州举办的用户研学活动&#xff0c;感触颇多。 为什么会有这趟经历&#xff1f;说来也巧&#xff0c;前段时间因为开会需要入手了讯飞智能办公本X2&#xff0c;成了他们的用户&#xf…

20- tensorflow实现 10_monkeys分类 (tensorflow系列) (项目二十)

项目要点 10-monkey-species&#xff0c;是十个种类的猴子的图像集。txt 文件读取: labels pd.read_csv( ./monkey_labels.txt , header 0)训练数据 图片数据增强: # 图片数据生成器 # 图片数据生成器 train_datagen keras.preprocessing.image.ImageDataGenerator(rescal…

docker升级后启动失败 需要指定storage driver

问题描述&#xff1a;闲来无事就在开发电脑上执行了下sudo apt-get upgrade 升级下软件, 升级后docker启动失败.使用 journalctl -xeu docker.service 查看docker执行日志&#xff1a;Mar 04 16:48:10 pop-os dockerd[39273]: time"2023-03-04T16:48:10.35187991208:00&qu…

[Java代码审计]—OFCMS

环境搭建 下载地址&#xff1a;https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip 项目导入idea&#xff0c;创建数据库&#xff0c;配置下tomcat就行&#xff0c;但要注意必须tomcat>8.5&#xff0c;mysql>5.7 漏洞分析 任意文件写入 com.ofsoft…

打包可执行文件

将Python脚本打包成可执行文件的方法&#xff1a;使用pip安装PyInstaller&#xff1a;pip install pyinstaller打开终端并导航到包含Python脚本的目录。运行PyInstaller创建可执行文件&#xff1a;pyinstaller --onefile phonequeryresult.py将my_script.py替换为您的脚本名称。…