全球热讯:Spring之AOP|使用场景、原理、配置、使用方式
原文网址:Spring之AOP系列--使用场景/原理_IT利刃出鞘的博客-CSDN博客
简介
(相关资料图)
本文介绍Spring AOP的使用场景、原理、配置、使用方式。
AOP使用场景
Spring AOP解决了什么问题?
问题使用SpringAOP之后
除了核心逻辑,还要关注非核心逻辑把非核心业务封装起来,只写核心业务即可
代码重复率高(比如输出同样的日志格式)公共非核心的封装起来,格式在公共部分给出即可。
使用场景
权限管理、异常处理、操作日志、事务控制。
实际项目中AOP的用法
权限管理 情景1:控制用户的功能权限 方案详述:在@ControllerAdvice里边,处理全局请求,控制权限。权限管理的其他方案:(除了AOP之外的方案) 在过滤器或者拦截器中处理使用Shiro中间件异常处理 情景1:在@ControllerAdvice里边,处理全局异常情景2:将Dubbo接口作为切面,统一处理Dubbo接口里边的异常操作日志 情景1:按产品的需求,有的接口需要记录操作日志 自定义注解,需要记录操作日志的,则在Controller的方法上加此注解AOP中判断,如果有这个自定义注解,则将参数异步写到日志数据库将数据同步到ES 情景1:增删改数据时,同时要处理MySQL和ES 将相关类作为切面,若数据库提交,则写到ES;若回滚,则不写到ES事务控制 情景1:使用Spring的@Transactional
AOP有哪几种通知,如果方法执行失败,哪个通知不会执行?
前置,后置,环绕,返回,异常。失败后,返回不会执行(即使失败,后置也会执行)。
AOP原理(实现方式)
Spring AOP的动态代理主要有两种方式实现,JDK动态代理和cglib动态代理。 见:Java设计模式--代理模式--静态代理/动态代理--使用/详解/实例_IT利刃出鞘的博客-CSDN博客
项JDK动态代理cglib动态代理
类名java.lang.reflect.InvocationHandlerorg.springframework.cglib.proxy包下的原生接口源自cglib库。
方法拦截器public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;org.springframework.cglib.proxy.Callback、 org.springframework.cglib.proxy.MethodInterceptor
public interface MethodInterceptor extends Callback {Object intercept(Object obj, Method m, Object[] args, MethodProxy mp) throws Throwable }
调用方法method.invoke(Object, args)
该动态代理是基于接口的动态代理,所以并没有一个原始方法的调用过程,整个方法都是被拦截的。调用其他同类对象的原方法:mp.invoke(Object obj, Object[] args)
调用原始(父类)方法:mp.invokeSuper(Object obj, Object[] args)
SpringBoot对AOP的配置
简介
如果引入的是spring-aop包,则需要使用@EnableAspectJAutoProxy开启aop功能;如果引入的是spring-boot-starter-aop,则AOP就直接可以用了,无需加注解之类的开启它。
对于SpringBoot
spring-boot-starter-aop (此包里包含了spring-aop与aspectjweaver)
对于Spring
spring-aop:AOP核心功能,例如代理工厂等等aspectjweaver:支持切入点表达式、aop相关注解等。(本依赖包含aspectjrt) aspectjrt:支持aop相关注解等。
AOP的启用
导入包即可,默认开启:spring.aop.auto=true //等价于@EnableAspectJAutoProxy
JDK代理与CGLIB代理
SpringBoot 1.5.x:默认使用JDK代理,即:spring.aop.proxy-target-class=false 若设置为true,则使用CGLIB动态代理。 SpringBoot 2.x:默认使用CGLIB代理,即:spring.aop.proxy-target-class=true。
对应的自动配置类为:org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
为什么SpringBoot 2.x:默认使用CGLIB代理?
见spring的issue:https://github.com/spring-projects/spring-boot/issues/5423
即:我们应该使用@EnableTransactionManagement(proxyTargetClass = true)来防止人们不使用接口时出现讨厌的代理问题。
讨厌的代理问题
假设,我们有一个UserServiceImpl和UserService类,此时需要在UserContoller中使用UserService。在 Spring 中通常都习惯这样写代码:
@AutowiredUserService userService;
在这种情况下,无论是使用 JDK 动态代理,还是 CGLIB 都不会出现问题。
但是,如果你的代码是这样的呢:
@AutowiredUserServiceImpl userService;
这个时候,如果我们是使用 JDK 动态代理,那在启动时就会报错:
SpringAOP与 Aspectj
注意
SpringAOP功能已经基本够用了,除非要在接口上动态代理或者方法拦截精确到getter和setter。这些奇葩的需求,一般不使用Aspectj。
问题:既然一般用不到Aspectj,为什么都要引入Aspectjweaver包?
答案
SpringAOP如果使用xml来配置,是不需要引入Aspectjweaver包的。项目中引入Aspectjweaver包仅仅是为了使用它的注解和切入点表达式。SpringAOP在运行时,用的核心功能是它自己的那一套(动态代理),与Aspectj的编译器或者织入器无任何关系。
无论是使用spring aop还是 aspectj都需要aspectjweaver.jar spring-aop.jar这两个jar包。
简介
项Spring AOPAspectJ
织入时机只能运行时织入。支持编译时、编译后和加载时织入。不支持运行时织入
原理代理由目标对象创建的, 且切面应用在这些代理上运行前织入。
性能比 AspectJ 慢多了更好的性能
切入(编织)位置仅支持方法切入点。且只匹配public方法支持所有切入点:
public, protected, private皆可。
字段、方法、构造函数、静态初始值设定项、最终类/方法等皆可
管理的类只能在由 Spring 容器管理的 bean 上实现可在所有域对象上实现
编程语言在纯 Java 中实现使用 Java 编程语言的扩展实现。
目标
Spring aop 旨在提供一个跨 Spring IoC 的简单的 aop 实现, 以解决程序员面临的最常见问题。它不打算作为一个完整的 AOP 解决方案 —— 它只能应用于由 Spring 容器管理的 bean
AspectJ 是原始的 aop 技术, 目的是提供完整的 aop 解决方案。它更健壮, 但也比 Spring AOP 复杂得多。还值得注意的是, AspectJ 可以在所有域对象中应用。
织入
AspectJ 和 Spring AOP 都使用不同类型的编织, 这会影响它们在性能和易用性方面的行为。
AspectJ 使用三种不同类型的Weaving: 1.编译时 Weaving: AspectJ 编译器作为输入我们的方面的源代码和我们的应用, 并产生一个织入类文件作为输出; 2.编译后 Weaving: 这也称为二进制织入。它是用来织入现有的类文件和 JAR 文件与我们的方面; 3.加载时间 Weaving: 这就像前二进制织入, 不同的是织入被推迟, 直到类加载程序加载类文件到 JVM。
内部结构与应用
Spring aop 是基于代理的 aop 框架。这意味着, 要实现目标对象的各个方面, 它将创建该对象的代理。使用以下两种方法之一实现: 1.JDK 动态代理 —— Spring AOP 的首选方式。只要目标对象实现甚至一个接口, 就会使用 JDK 动态代理; 2.CGLIB 代理 —— 如果目标对象没有实现接口, 则可以使用 CGLIB 代理。 我们可以从 官方文档 中了解有关 Spring AOP 代理机制的更多信息。
AspectJ 在运行时不做任何事情, 因为类是直接用方面进行编译的。 与 Spring AOP 不同, 它不需要任何设计模式。为了编织代码的各个方面, 它引入了称为 AspectJ 编译器 (ajc) 的编译器, 通过它编译我们的程序, 然后通过提供一个小型 (100K) 运行时库来运行它。
joinpoints
Spring AOP 是基于代理模式的。因此, 它需要将目标 Java 类分类, 并相应地应用交叉问题。但这是有限制的。我们不能在 "最终" 类中应用交叉问题 (或方面), 因为它们不能被重写, 因此会导致运行时异常。同样适用于静态和最终方法。不能将 Spring 方面应用于它们, 因为它们不能被覆盖。因此, 由于这些限制, Spring AOP 只支持方法执行连接点。
AspectJ 在运行前直接将横切关注点编织到实际代码中。与 Spring AOP 不同, 它不需要对目标对象进行子类, 因此也支持许多其他 joinpoints。
支持的 joinpoints 的摘要:
JoinpointSpring AOP SupportedAspectJ Supported
Method CallNoYes
Method ExecutionYesYes
Constructor CallNoYes
Constructor ExecutionNoYes
Static initializer executionNoYes
Object initializationNoYes
Field referenceNoYes
Field assignmentNoYes
Handler executionNoYes
Advice executionNoYes
简单性
Spring AOP 显然更简单, 因为它不会在我们的构建过程中引入任何额外的编译器或织入。它使用运行时编织, 因此它与我们通常的构建过程无缝集成。虽然它看起来很简单, 但它只适用于由 Spring 管理的 bean。
AspectJ:我们需要引入 AspectJ 编译器 (ajc) 并重新打包所有的库 (除非我们切换到编译后或加载时间的织入)。当然,,这比前者更复杂,,因为它引入了 AspectJ Java 工具 (包括编译器 (ajc)、调试器 (ajdb)、文档生成器 (ajdoc)、程序结构浏览器 (ajbrowser)),我们需要将它们与我们的 IDE 或构建工具集成。
性能
就性能而言,,编译时织入比运行时织入快得多。
Spring AOP 是基于代理的框架, 因此在应用程序启动时会创建代理。另外, 每个方面还有一些方法调用, 这会对性能产生负面影响。
AspectJ 在应用程序执行之前将这些方面编织到主代码中, 因此没有额外的运行时开销, 与 Spring AOP 不同。
基于这些原因,,AspectJ 的速度几乎比 Spring AOP 快8到35倍。
这两个框架是完全兼容的。 我们可以随时利用Spring AOP,并且仍然使用AspectJ来获得前者不支持的连接点。
其他网址
原理
Java设计模式--静态代理与动态代理_IT利刃出鞘的博客-CSDN博客Spring中的AOP原理_Java_ChaunceyChen的博客-CSDN博客Spring AOP实现原理_Java_yanweihpu的博客-CSDN博客
实现方式
springCloud AOP功能实现 - 尘叙缘的个人空间 - OSCHINA - 中文开源技术交流社区
Spring 5 AOP 默认改用 CGLIB 了?从现象到源码的深度分析 - 云+社区 - 腾讯云
标签:
相关推荐:
最新新闻:
- 通过Chrome来知道提交加价的请求应该是什么?_今日观点
- 舍入模式有哪些?八种舍入模式的解释 每日视讯
- 如何下载Navicat数据库管理编辑软件?如何打开.db数据库文件? 世界头条
- FB是什么意思?PCB原理图中的FB是什么意思?
- QQ象棋java通用版怎么下载?QQ中国象棋官方免费版下载
- 【全球速看料】启动定时器t0的工作指令是什么?PLC通电延时定时器(TON)应用举例
- dm-verity是如何保证安全的?dm-verity-ramdisk文件系统校验的解决方法:今日关注
- 如何进行正交试验设计?试验设计—正交表的使用方法:每日时讯
- 全球最资讯丨如何在windows上交叉编译ffmpeg?具体操作步骤
- 全球热讯:Spring之AOP|使用场景、原理、配置、使用方式
- 《孤岛惊魂6》将于2月16日在全平台开启免费试玩
- 【环球报资讯】RAM展示概念图 或推出电动皮卡
- 环球观速讯丨RTX4060!机械革命游戏本只要6199
- 基于体温监测 三星手表将推出经期管理功能
- 健康度掉太快 三星升级990Pro固件-最新资讯
- 2022年度智能穿戴设备创新排行榜发布 智能健康穿戴驶入快车道
- 兄弟管道官网发现《超级马里奥兄弟大电影》隐藏海报 全球快消息
- 渠道商预售 AMD游戏神U锐龙7000 144MB缓存版:每日消息
- 南宁一男子商场内刺伤一女子后投江!警方通报
- 死亡空间重制版欧洲前两周销量不及木卫四协议_快看点
- 《大富翁11》现已完全支持Steam Deck-焦点热议
- 超狂身材曲线太过分 印尼电竞女选手火辣至极
- 世界快资讯丨索尼FE 50mm F1.4 GM镜头外观曝光
- 情人节惊喜福利:购影驰RTX 30显卡,送穿越火线大礼包 天天快看点
- 环球观察:潮邦集成灶怎么样?真实用户有话说!
- 优化碰撞监测 苹果iOS16更新再次尝试-今亮点
- 更新iOS 谷歌服务大范围无法访问
- 全球快资讯:2020最新新年对联大全_春节对联集锦大全
- 看视频软件app排行榜_看视频软件
- 2019立秋为什么吃饺子 立秋适合吃饺子吗
- 2023年情人节单日票房破两亿 《满江红》领跑|当前速递
- 每日速看!永安林业违反会计准则 被出具警示函
- 《战神》总监承认同伴破坏解谜体验:做的时候没想到-每日速递
- 世界最资讯丨XGPU和EA Play会员已可试玩《狂野之心》 时长约10小时
- 【世界热闻】上海迪士尼度假区与三星电子达成推广合作, 庆祝三星新品手机发布
- 索尼正在研究如何把PS5塞进桌斗里:抱着送人太沉了|资讯
- 程序员的好帮手?网友开始尝试用ChatGPT开发游戏
- 天天要闻:早期版的《战神5》 奎爷曾被雷神杀死
- “超时空办公”时代已来 联想发布智慧办公白皮书 每日时讯
- 【聚看点】拓界影像稳劲性能 三星Galaxy S23系列旗舰手机国内发布
- 速递!“逆城市”建设类游戏《伊始之地》宣传片公开
- 即时:外国女孩穿汉服COS东方美人 网友感慨:这波中华文化输出赢麻了
- 滤镜景点诈骗又来了!7朵郁金香撑起上海武康路流量
- 伊朗外交部发言人:总统莱希访华将加强伊中关系
- 当前关注:关于国际市场营销案例分析
- 暗影精灵9Plus高能版预售 酷睿i7+RTX 4070 10999元
- 世界观热点:爸爸因姜姓难取名给孩子叫去寒 网友吐槽略随意
- 当前看点!剧版《最后生还者》致敬游戏第二部彩蛋:乔尔同款背包
- 以爱为名 浪漫相伴 尼康精选挚爱佳作献礼甜蜜情人节
- 情人节好礼! 购映众显卡赠《穿越火线》限定豪礼
- 《三体》史强名场面大多是于和伟设计的:包括广场舞_最新
- 快看:快来游玩《PGA TOUR 2K23》在Tony Finau的梦幻球场上尽情挥杆
- 每日速看!卡牌潮玩产业生态联盟正式成立
- 【世界报资讯】1月手游出海收入榜 《原神》蝉联第一
- 全球今头条!《狂野之心》游戏太难?连游戏总监自己都打不过去
- 虚拟人雕妹EP单曲MV《斑斓》首发
- 享誉全球的PFU扫描仪将于2023年4月切换至理光品牌上市_每日简讯
- 潮邦集成灶怎么样?三大维度全面解析:世界动态
- 当前简讯:雷蛇灵刃18上架:首发价23999元、可选RTX 4060 RTX 4070显卡
- 苹果iOS 16.3.1正式推送:优化车祸检测功能 减少误判
- 曝魅族20内部代号凤凰 双版本机型 起售价3500元 世界播资讯
- 小岛秀夫晒与《死亡搁浅2》两位女主合影:左拥右抱美得很:全球新要闻
- 23999元起 雷蛇新款灵刃18上架:可选RTX4060/70
- 全球观速讯丨贾跃亭FF91首款准量产车运抵中国 进行测试和验证
- 《流浪地球2》导演郭帆:我们在这方面弯道超车好莱坞|最资讯
- 环球今日讯!《仙剑奇侠传7》DLC上线 N卡光追开启/关闭对比图
- 国家药监局发布15批次化妆品检出禁用原料的通告|聚看点
- XPE有哪些安全特性?XPE的安全特性介绍|全球新要闻
- isp接口IP地址均为公有地址该如何配置?R6teInetR5公有IP地址的使用方法|世界百事通
- 安卓开发Android studio学习笔记 利用SQLiteDatabase操作数据表
- 浮点保留两位小数 R语言初级教程 每日热门
- 小米Connectify无法连接xp怎么办?解决方法步骤|天天快报
- 观速讯丨英伟达RTX4060桌面显卡曝光,移动版新品已上架开售
- 魅族20 Pro外观曝光:竖排三摄、采用直角边框:全球热讯
- 小米激光打印一体机 K100 发布:首发 849 元-环球速看料