Spring AOP 实现方式与应用
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring AOP 实现方式与应用相关的知识,希望对你有一定的参考价值。
文章目录
Spring AOP
Spring AOP 概念
AOP(Aspect Oriented Programming)是面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为独立的模块。
Spring AOP 的术语:
-
连接点(join point):对应的是具体被拦截的对象,因为Spring只能支持方法,所以被拦截的对象往往就是指特定的方法,AOP将通过动态代理技术把它织入对应的流程中。
-
切点(point cut):有时候,我们的切面不单单应用于单个方法,也可能是多个类的不同方法,这时,可以通过正则式和指示器的规则去定义,从而适配连接点。切点就是提供这样一个功能的概念。
-
通知(advice):就是按照约定的流程下的方法,分为前置通知、后置通知、环绕通知、事后返回通知和异常通知,它会根据约定织入流程中。
-
目标对象(target):即被代理对象。
-
引入(introduction):是指引入新的类和其方法,增强现有Bean的功能。
-
织入(weaving):它是一个通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按约定将各类通知织入约定流程的过程。
-
切面(aspect):是一个可以定义切点、各类通知和引入的内容的模块化实现,SpringAOP将通过它的信息来增强Bean的功能或者将对应的方法织入流程。
Spring AOP 实现方式
AOP可以有多种实现方式,而Spring AOP支持如下两种实现方式:
- JDK动态代理:这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。
- CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。
Spring AOP 的应用场景
Spring AOP为IoC的使用提供了更多的便利,一方面,应用可以直接使用AOP的功能,设计应用的横切关注点,把跨越应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活地编制到模块中,比如可以通过AOP实现应用程序中的日志功能。
另一方面,在Spring内部,一些支持模块也是通过Spring AOP来实现的,比如事务处理。从这两个角度就已经可以看到Spring AOP的核心地位了。
Spring AOP 注意事项:
Spring AOP不能对哪些类进行增强?
- Spring AOP只能对IoC容器中的Bean进行增强,对于不受容器管理的对象不能增强 。
- 由于CGLib采用动态创建子类的方式生成代理对象,所以不能对final修饰的类进行代理。
既然有没有接口都可以用CGLIB,为什么Spring还要使用JDK动态代理?
在性能方面,CGLib创建的代理对象比JDK动态代理创建的代理对象高很多。但是,CGLib在创建代理对象时所花费的时间比JDK动态代理多很多。
所以,对于单例的对象因为无需频繁创建代理对象,采用CGLib动态代理比较合适。反之,对于多例的对象因为需要频繁的创建代理对象,则JDK动态代理更合适。
Spring AOP 代码案例:
可以参考我之前的博客:https://blog.csdn.net/weixin_45525272/article/details/125955628,https://blog.csdn.net/weixin_45525272/article/details/125955860
等
以上是关于Spring AOP 实现方式与应用的主要内容,如果未能解决你的问题,请参考以下文章