什么是 AOP,AOP 的作用是什么?

2023-05-16

分析&回答


AOP的介绍

  1. AOP全称(Aspect Oriented Programming)面向切片编程的简称。AOP面向方面编程基于IoC,是对OOP的有益补充;
  2. AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
  3. AOP代表的是一个横向的关 系,将“对象”比作一个空心的圆柱体,其中封装的是对象的属性和行为;则面向方面编程的方法,就是将这个圆柱体以切面形式剖开,选择性的提供业务逻辑。而 剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹,但完成了效果。
  4. 实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
  5. Spring实现AOP:JDK动态代理和CGLIB代理 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理;其核心的两个类是InvocationHandler和Proxy。 CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强;需要引入包asm.jar和cglib.jar。使用AspectJ注入式切面和@AspectJ注解驱动的切面实际上底层也是通过动态代理实现的。

AOP的作用:

  1. 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。
  2. 利用AOP对业务逻辑的各个部分进行隔离,降低业务逻辑的耦合性,提高程序的可重用型和开发效率。
  3. 主要用于对同一对象层次的公用行为建模

使用AOP的几种方式

  1. 经典的基于代理的AOP
  2. @AspectJ注解驱动的切面
  3. 纯POJO切面
  4. 注入式AspectJ切面

AOP使用场景

  • Authentication 权限检查
  • Caching 缓存
  • Context passing 内容传递
  • Error handling 错误处理
  • Lazy loading 延迟加载
  • Debugging  调试
  • logging, tracing, profiling and monitoring 日志记录,跟踪,优化,校准
  • Performance optimization 性能优化,效率检查
  • Persistence  持久化
  • Resource pooling 资源池
  • Synchronization 同步
  • Transactions 事务管理

反思&扩展


常见的通知

  • 前置通知 方法执行前调用 对应注解 @Before
  • 后置通知 方法执行后调用 对应注解 @After
  • 返回通知 方法返回后调用 对应注解 @AfterReturning
  • 异常通知 方法出现异常调用 对应注解 @AfterThrowing
  • 环绕通知 动态代理、手动推荐方法运行 对应注解 @Around

连接点(Joinpoint)

程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法调用时、异常抛出时、方法返回后等等。

切入点(Pointcut)

通知定义了切面要发生的“故事”,连接点定义了“故事”发生的时机,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,Spring中允许我们方便的用正则表达式来指定。

切面(Aspect)

通知、连接点、切入点共同组成了切面:时间、地点和要发生的“故事”。

引入(Introduction)

引入允许我们向现有的类添加新的方法和属性(Spring提供了一个方法注入的功能)。

目标(Target)

即被通知的对象,如果没有AOP,那么通知的逻辑就要写在目标对象中,有了AOP之后它可以只关注自己要做的事,解耦合!

代理(proxy)

应用通知的对象,详细内容参见设计模式里面的动态代理模式。

织入(Weaving)

把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:

  • 编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ的织入编译器;
  • 类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码;
  • 运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术。

为了大家更加方便的刷题,我们对文章进行了分类和整理,免费为大家提供刷题服务。程序员不欺骗程序员,赶紧扫码小程序刷起来!
请添加图片描述

为了一站式解决面者刷题问题,部分内容可能存在摘录情况,如有侵权辛苦您留言联系我们,我们会删除文章或添加引用文案,Thanks!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 AOP,AOP 的作用是什么? 的相关文章

  • 使用aspectj来分析选定的方法

    我想使用方面j 来分析库 我的计划是用注释来标记需要分析的方法 Profiled logicalUnitOfWork 然后有一个方面会在使用方法之前和之后触发logicalUnitOfWork以突出显示概要内容 所以 我的切入点开始看起来像
  • Spring AOP - @Pointcut:@Test 方法的 @Before 建议不起作用

    我正在与 Spring框架4 3 2 方面J 1 8 9 JUnit Gradle 该项目基于多模块 In src main java main 我有一些 Aspect课程和他们按照预期的方式工作 我可以通过运行时和测试来确认 现在我需要
  • 从 ProceedingJoinPoint 获取 java.lang.reflect.Method?

    问题很简短 有没有办法从aspectj ProceedingJoinPoint 获取Method 对象 目前我正在做 Class parameterTypes new Class joinPoint getArgs length Objec
  • Aspectj 与 Android 库

    我有一个使用方面的库 并且可以通过 Maven 获得 现在我尝试在 Android 应用程序中使用该库 如果我包括这个插件 https github com uPhyca gradle android aspectj plugin在应用程序
  • @Around 建议在 Spring AOP 中到底是如何工作的?

    我在学习春季AOP模块 我对它的具体工作原理有一些疑问AROUND advice 阅读官方文档 http docs spring io spring docs current spring framework reference html
  • 自定义属性在编译时执行

    我正在尝试创建一个自定义属性 该属性将以某种 AOP 方式工作 不幸的是 我无法访问 postsharp 而且我对 Unity 也不是很熟悉 它有 AttributeUsage Method 并在其构造函数中配置测试环境的某些部分 从 ap
  • Java Aspect 返回要在方法中使用的值

    我有一个 After运行某些逻辑的java方面 我需要它返回一个结果 一个对象 该结果可以在方面切入点拦截的方法中使用 是否可以 你需要的是 Around它允许您将想要的任何内容返回给建议的对象 Around com xyz myapp U
  • 从 joinPoint 获取 HTTP 方法

    我需要从某个方面的 joinPoint 获取像 POST PATCH GET etc 这样的 http 方法 Before isRestController public void handlePost JoinPoint point do
  • 如何在 Spring 中管理对象池?

    据我了解 在 Spring 中 所有对象默认都被视为单例 如果 singleton 设置为 false 则每个请求都会提供一个新对象 但是如果我想池化对象怎么办 假设设置范围从最少 1 到最多 10 个实例 使用 Spring 可以吗 池化
  • 经典C++(带类的C)的调用/返回功能,哪些现代语言具有它?

    第 57 页C 的设计和演变 https rads stackoverflow com amzn click com 0201543303 Stroustrup 博士谈到了一个最初是 C with Classes 的一部分的功能 但它不是现
  • 面向方面编程(AOP)有哪些缺点?

    面向方面编程有哪些可能的和关键的缺点 例如 新手的神秘调试 可读性影响 我认为最大的问题是没人知道如何定义切面的语义 or 如何非程序地声明连接点 如果您无法独立于要嵌入的上下文来定义某个方面的功能 或者无法以不损害其嵌入的上下文的方式定义
  • 如何使用 Ninject 设置可选方法拦截?

    假设我有一个类 我有时想 但现在总是 拦截一些 但不是全部 方法 据我了解 这可以通过以下方式完成 InterceptAround 在我的 Ninject 模块中 在更高级别的代码中 或者在这些方法上使用 InterceptAttribut
  • 如何使用spring AOP切入点表达式拦截返回类型List

    以下是我的方面课程 我正在努力让所有的回报List从我的baserepostitary Aspect Service public class DecryptionAspect AfterReturning value execution
  • @Transactional 和 AOP 之间的混淆

    Transactional 是否在 Spring 3 中替代了 AOP 它们相同吗 我可以说 Transactional在内部实现了AOP吗 The Transactionnal注释只是声明方法 或类的所有方法 是事务性的简单方法 Spri
  • @Aspect 方面的 Spring 自动装配 bean 为 null

    我有以下弹簧配置
  • 在单独的模块中使用 Spring AOP 方面

    我在一个 Maven 项目模块中有一个方面 com x NiceAspect 在一个单独的 Maven 模块中有一个类 com x NiceClass 这些模块具有相同的 POM 父级 共同创建一个项目 我想要实现的目标是拥有一个通用的方面
  • 如何更改运行时中的方法注释值?

    我有像这样的控制器 MessageMapping room register SendTo sendTo public Message addUser Payload Message message SimpMessageHeaderAcc
  • 为什么 Jersey 控制器未检测到我的方面(使用自定义注释)?

    我想在 Jersey 控制器上创建一个方面来测量服务执行所需的时间 我正在与我的切入点作斗争 因为它没有被检测到 而且我的方面永远不会启动 我尝试过使用很多切入点 例如 execution Monitor execution public
  • 有关 iOS 应用程序包装的信息?

    有一个称为应用程序包装的过程 IPA被反汇编 被拆开 有时可执行部分确实被反汇编 添加了一些新的二进制代码 资源 段 IPA再次组装 这个过程经常被用作编译时 AOP 向应用程序添加一些方面 如安全性 审计等 您见过用于此目的的任何指南 工
  • 如何使用 AspectJ 将字段添加到自定义注释的类

    要使用aspectj向某个特定类添加字段 我们需要这样做 package com test public class MyClass private String myField public aspect MyAspect private

随机推荐

  • 腾讯云4核8G服务器性能怎么样?

    腾讯云4核8G云服务器的价位硬件配置性能指标怎么样 如何买便宜呢 4核8G云服务器是中大型商业网站及服务采用的实例规格 xff0c 能够 承载每日几十万浏览量的网站服务 当一个企业网站发展到这一程度的情况下 xff0c 针对云服务器成本费用
  • networkx画图

    使用networkx画图 xff0c 关键是掌握draw networkx edges draw networkx nodes和draw networkx labels三个方法的使用 xff0c 设置好位置列表 xff0c 节点列表 xff
  • virt-manager cannot open display

    解决方法 xff1a 1 vi etc ssh sshd config 2 找到 34 X11Forwarding no 34 修改为 34 X11Forwarding yes 34 3 service sshd restart 4 重启终
  • 【蓝牙模块】三款常用的基础蓝牙模块,HC05,JDY-31,CC2541介绍与测试说明

    文章目录 一 HC05二 JDY 311 介绍2 测试 二 CC2541 一 HC05 HC05与其他两款的区别是 xff0c 需要按住RST键进入AT指令模式 一 上电进入AT模式方法 先按住HC05蓝牙模块上面的RST按键 xff0c
  • #Ubuntu#SSH 新建虚拟机开启SSH服务

    由于Ubuntu默认未安装SSH服务 xff0c 所以需要通过联网下载安装SSH服务 前置条件 xff1a Ubuntu需要配置好网络地址 xff0c 并配置正确的DNS服务器 xff0c 能够正常上网 1 右键打开终端界面 xff0c 输
  • #Ubuntu#root 新建虚拟机怎么切换到root用户权限

    我现在新建了一台ubuntu xff0c 需要通过切换到root用户执行文件 xff0c 发现怎么切换都是失败的 通过su root命令 xff0c 输入普通用户的密码 xff0c 会显示认证错误 xff0c 百度了一下 xff0c 这是由
  • Gradle--›Spring Kotlin多模块项目搭建√

    文章目录 前言使用IntelliJ IDEA创建单模块工程搭建多模块环境创建主模块创建库模块 部署参考文档联系作者 前言 环境说明 工具版本IntelliJ IDEAUltimate 2021 1SpringBoot2 5 0Kotlin1
  • #华为 #usg 华为防火墙安全区域的概念

    简介 安全区域 xff08 Security Zone xff09 xff0c 或者简称为区域 xff08 Zone xff09 xff0c 是设备所引入的一个安全概念 xff0c 大部分的安全策略都基于安全区域实施 定义 一个安全区域是若
  • #VMware ESXI7.0的下载

    一 VMware ESXI7 0版本的下载 xff08 一 xff09 概述 VMware vSphere是VMware公司推出的服务器虚拟化解决方案 xff0c 包含两个重量级的产品 xff1a VMware ESXI和VMware vC
  • #VMware#ESXI 配置虚拟机服务器开机自启动

    目录 1 登录到esxi xff0c 配置管理模块 2 将虚拟机配置开机启动 3 返回主机管理界面 xff0c 完成配置 4 停电后重启主机 xff0c 查看并验证自启动是否生效 1 登录到esxi xff0c 配置管理模块 选择管理 系统
  • #VMware#ESXI ESXI如何修改管理IP

    目录 一 修改方法 1 进入硬件管理平台 2 登录虚拟控制台 二 实际操作 1 在主界面按 F2 并输入控制台界面root的密码 xff0c 进入设置界面 2 找到 configure Management Network 选项并按 Ent
  • #华为 #usg USG6000双链路透明部署实验(一)

    目录 一 实验背景 二 实验环境 三 实验步骤 1 在所有交换机创建对应vlan 2 在核心交换机创建网关 xff0c 所有的网段IP都是254 网段是10 10 10 0 24 10 10 13 0 24 3 配置接入交换机的管理IP x
  • #VMware#ESXI 修改主机的控制台HTTP/HTTPS端口

    目录 一 开启SSH服务 二 修改控制台的默认端口 1 关闭防火墙的情境下 xff1a 1 1 远程进入ESXI的后台 xff0c 修改HTTP端口配置文件 1 2 关闭ESXI防火墙 1 3 重启服务器 2 不关闭防火墙的情景下 xff1
  • #ESXI #Centos 业务服务器故障如何恢复盘

    一 环境描述 有一台centos7的业务服务器 xff0c 因为操作人员重大失误 xff0c 导致业务服务器宕机 xff0c 由于未做备份与快照 xff0c 无法进行恢复 xff0c 考虑通过将硬盘挂载在其他虚拟机上重新获取数据 设备环境为
  • pikachu 靶场搭建

    一 准备环境 1 搭建环境 win 10phpstudypikachu 2 下载链接 win10自行寻找资源 pickchu靶机下载地址 xff1a https github com zhuifengshaonianhanlu pikach
  • virtualbox命令行启动虚拟机和关闭虚拟机和虚拟机关闭防火墙

    查看virtualbox正在运行的虚拟机命令 VBoxManage list runningvms 根据查到的虚拟机 ip 号 使用后台命令启动虚拟机的方法 xff1a VBoxManage startvm ip 使用后台命令关闭虚拟机的方
  • android studio 最新3.0 kotlin与databinding 结合使用报错。

    最近android studio 3 0更新 xff0c 迫不及待将项目中的代码向kotlin转 其中转到有databinding的时候遇到报错 xff1a Unresolved reference databinding 找到网上解决办法
  • AS--›Android Studio内存大小设置和插件推荐(2021-1-14更新)

    调整AS的占用内存 多开工程毫无压力 AS 3 5 的版本 已经支持通过设置界面修改内存大小了 但是 旧方法依旧有效 文章目录 Windows修改方法MAC修改方法插件推荐 ignore A Search with GithubTransl
  • android Camera预览界面拉伸问题解决

    问题现象 项目中的扫一扫界面打开以后 xff0c 扫描二维码的界面显示的二维码被拉伸 xff0c 图片如下 xff1a 问题原因 通常 xff0c 拍照预览页面的视图拉伸主要与下面两个因素有关 xff1a Surfaceview的大小Cam
  • 什么是 AOP,AOP 的作用是什么?

    分析 amp 回答 AOP的介绍 AOP全称 xff08 Aspect Oriented Programming xff09 面向切片编程的简称 AOP面向方面编程基于IoC xff0c 是对OOP的有益补充 xff1b AOP利用一种称为