概念
横切关注点
横切关注点通常包括日志记录、事务管理、安全性、性能监控等,它们跨越多个类和模块,并且与业务逻辑代码正交
切面
AOP中,这些横切关注点被封装在“切面”(Aspect)中
切面定义了何时(when)、何地(where)以及如何(how)应用这些横切逻辑。切面可以看作是一个包含通知(Advice)和切点(Pointcut)的模块
通知
通知定义了横切逻辑的具体实现
切点
切点则定义了通知应该应用到哪些连接点(Join Point)上
连接点
连接点是程序执行过程中的一个特定点,如方法的调用或异常的处理
简介
面向切面编程,是对面向对象编程的一种补充和完善,它以通过预编译方式和运行期动态代理方式实现,在不修改源代码的情况下,给程序动态统一添加额外功能的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
核心思想
将横切关注点与业务逻辑代码分离,以提高代码的可维护性、可重用性和模块化。通过将横切关注点封装在切面中,可以避免在多个类中重复编写相同的代码,并且可以在不修改现有代码的情况下添加新的横切逻辑
SpringAOP
Spring AOP则是Spring框架的一部分,它提供了基于代理的AOP实现方式,并支持AspectJ的注解
SpringAOP是Spring框架的一部分,与Spring的其他功能(如事务管理、安全等)紧密集成,提供了方便的扩展和定制能力
Spring AOP使用纯Java实现,通过运行时动态代理的方式(基于JDK动态代理或CGLIB)向目标类织入增强代码
JDK动态代理
Spring AOP默认使用JDK Dynamic Proxy来生成代理对象
JDK动态代理是基于接口的代理,它要求目标类必须实现一个或多个接口
如果目标类实现了接口,Spring会默认使用JDK动态代理
JDK动态代理通过实现InvocationHandler接口来调用原对象的实现,并且所有要被代理的方法都必须是接口中声明的方法
CGLIB动态代理
如果目标对象没有实现接口,Spring AOP则会使用CGLIB(Code Generation Library)来生成代理对象
CGLIB动态代理是一种基于继承的代理,它不要求目标类实现任何接口
它通过生成目标类的子类来实现代理,因此即使目标类是一个普通的类,也能够进行代理
CGLib动态代理的性能通常比JDK动态代理要好,但可能会因为继承的问题导致某些问题