关于Spring AOP的灵魂十问

本文详细介绍了Spring AOP的概念、用途、与AspectJ的关系,以及如何使用Spring AOP,包括开启AspectJ支持、声明切面、切点和通知。同时,讨论了Spring如何实现AOP,JDK和CGLib动态代理的区别,以及代理对象的生成时机。最后,文中还提到了AOP的潜在弊端,强调了过度使用可能影响代码可读性。
摘要由CSDN通过智能技术生成

AOP全称是Aspect Oriented Programming,翻译过来是“面向切面”编程。在Java语言里,一切皆对象,所以我们通常说Java语言是一门“面向对象”编程的语言。而面向切面编程,不是要取代面向对象编程,而是对它的一种补充。

AOP要解决的问题是用一个“横切面”的方式,来统一处理很多对象都需要的,相同或相似的功能,减少程序里面的重复代码,让代码变得更干净,更专注于业务。

image.png

AOP能做什么?

AOP适合用来做一些比较通用的、与业务关系不大的事情。比较常见的就是调用日志、权限控制、调用时间和性能统计、参数校验等等。

其实Spring基于AOP做了很多有用的东西,比如大家可能会经常使用的事务、缓存、重试、Validation等等,底层都是使用的AOP。

自己用AOP实现一些小功能的需求也比较多。比如之前我们团队就有这样一个需求,我们在服务与服务之间的调用,不使用枚举,而是换成了使用字符串,即枚举相应字段的name。但是这样就带来了一个问题,如果调用方输入了一个不属于这个枚举的字符串,那到后面使用就会抛异常。所以我们希望能够在Controller层就把这个校验做了,该抛异常抛异常。

这是一个参数校验的需求,然而Spring提供的Validation和自定义Validation都无法实现这个需求,因为字段是字符串,但每次需要校验的枚举类型是不同的。所以我们就基于注解和AOP自己开发了这样一个枚举参数校验器。

Spring AOP和AspectJ是什么关系?

其实AOP并不是Spring的专属,AOP最开始是一种编程模型,后来大佬们为了探讨AOP的标准化,统一AOP规范,成立了一个AOP联盟。除了Spring外,AOP的框架有很多,比如AspectJ, AspectWerkz, JBoss-AOP。

最开始,Spring AOP和AspectJ是完全独立的,Spring有自己的实现和使用语法。但是Spring的AOP使用起来太麻烦了,深受大家吐槽。于是Spring支持了广受大家好评的AspectJ语法,通过在配置类上添加@EnableAspectJAutoProxy这个注解来开启对AspectJ的语法。

但Spring仅仅是支持了AspectJ的部分语法(有些语法是不支持的),但底层实现还是自己的一套东西。而且两个框架的目标不同,AspectJ是一套完整的AOP解决方案,更为健壮,但使用起来比较复杂,还需要使用特殊的语法和编译器。而Spring的目的是想要把AOP和IoC框架结合起来,让Spring管理的Bean能够很方便地使用AOP的功能。

所以Spring AOP和AspectJ没啥关系,只是Spring借鉴了Aspect的声明语法。

这里说清楚了AOP、Spring AOP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值