Spring-AOP

1 篇文章 0 订阅

什么是AOP?

AOP(Aspect Oriented Programming)译为面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码降低模块间的耦合度,并有利于未来的可拓展性和可维护性

看到这里时可能还是会不明白为什么要使用AOP,AOP的优势体现在哪里,那我们来举个例子

设想这一样个场景,在一个庞大的web项目中,我们想要在各个类实例进行操作时记录系统日志,基于OOP的形式我们该怎样实现?最简单粗暴的莫过于在所有的类上都加上日志输出,但是这种方法过于繁琐不便实现,且违反了对扩展开发,对修改关闭的开闭原则,显然不是一个好办法。

那么这个时候我们需要一个更合适的方案来对已有程序进行扩充,这就是AOP。同样的场景,我们仅需通过将公共行为封装为一个切面,在程序执行过程中需要触发的点进行触发即可实现预期功能,不仅实现难度大大下降,也遵守了开闭原则,这也就是AOP的意义所在。

理解了AOP的优势接下来我们来看一看AOP的一些基本概念

AOP中的基本概念

  • Aspect(切面):通常是一个类,里面可以定义切入点和通知
  • JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
  • Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
  • Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
  • AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以是JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类

**Advice(通知)**有5种类型:

  • @Before:在标有JointPoint(连接点)方法被调用之前调用Advice(通知)
  • @After:在方法完成后调用通知,无论方法是否执行成功
  • @After-returning:在方法成功执行之后调用通知
  • @After-throwing:在方法抛出异常后调用通知
  • @Around:在方法调用前和退出后都调用通知

spring中的AOP

AOP思想的实现一般都是基于 代理模式 ,在JAVA中一般采用JDK动态代理模式,但是我们都知道,JDK动态代理模式只能代理接口而不能代理类。因此,Spring默认使用JDK动态代理,在需要代理类而不是代理接口的时候,Spring会自动切换为使用CGLIB代理。Spring AOP 同时支持 CGLIB、ASPECTJ、JDK动态代理。

JDK动态代理和CGLIB动态代理的区别

首先我们来说JDK的动态代理,实现JDK的动态代理有一个必要的前置条件,那就是需要被代理的对象们都实现了同一个接口,可以说动态代理是代理了他们的共同接口中的方法

那么问题来了,在面向接口编程有接口可用的时候我们可以通过JDK动态代理完成预期目标,那如果我们要为没有接口联系的被代理类实现同一个动态代理要怎么办呢?

这个时候就需要CGLIB登场了,CGLIB的实现原理是通过生成一个被代理类对象的子类来实现功能的扩充,并不需要接口的限制,如下图

img

上面我们也提到了Aspectj,AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守java字节编码规范的Class文件,并且Spring AOP 已经集成了AspectJ。

Spring AOP 和 AspectJ AOP 有什么区别?

Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。

Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,

如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比Spring AOP 快很多。

这就是我对AOP的一些浅显了解,希望能够对你产生帮助,感谢观看(有空会补一些使用的相关例子)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值