AOP(Aspect-Oriented Programming,面向切面编程)是一种编程技术,它容许开发者在不扭转现有代码的状况下,减少新的性能或行为,这些性能或行为被称为“切面”。
AOP 能够通过预编译形式和运行期动静代理的形式来实现,它的次要目标是升高业务逻辑的耦合性,进步程序的可重用性和开发效率。
AOP 罕用于对立性能的解决,例如:事务管理、日志记录、权限查看等性能。
1.AOP 长处剖析
应用 AOP 的次要起因有以下几点:
- 模块化 :通过将公共行为(如日志记录、事务管理)提取为独立的切面,能够使代码更加模块化,进步代码的可维护性和可读性。
- 缩小反复代码 :通过应用 AOP,能够将反复的代码(如日志记录、权限查看)提取到一个切面中,防止在多个中央反复编写雷同的代码。
-
解耦 :AOP 容许开发者将业务逻辑与横切关注点(如日志记录、事务管理)拆散,从而升高业务逻辑的耦合性,进步程序的可重用性和可扩展性。
2.AOP 技术实现
AOP 实现技术次要分为两大类:动态代理和动静代理。
- 动态代理 :通过 AOP 框架提供的命令进行编译,从而在编译阶段生成 AOP 代理类。这种形式也被称为编译时加强。动态代理包含编译时编织和类加载时编织两种形式。
-
动静代理 :在运行时在内存中“长期”生成 AOP 动静代理类,因而也被称为运行时加强。动静代理次要有两种实现形式:
- JDK 动静代理 :JDK 动静代理要求被代理的类必须实现一个接口,它通过反射来接管被代理的类,并应用 InvocationHandler 接口和 Proxy 类实现代理。
-
CGLIB 动静代理 :CGLIB 则是一个代码生成的类库,它能够在运行时动静地生成某个类的子类,通过继承的形式实现代理。如果指标类没有实现接口,Spring AOP 会抉择应用 CGLIB 来动静代理指标类。
3.AOP 实现原理
Spring AOP(面向切面编程)的实现原理次要基于动静代理技术,它提供了对业务逻辑各个方面的关注点拆散和模块化,使得非功能性需要(如日志记录、事务管理、安全检查等)能够集中管理和保护,而不是扩散在各个业务模块中。
Spring AOP 实现原理的要害要点如下:
-
代理机制 :
- JDK 动静代理 :对于实现了接口的指标类,Spring AOP 默认应用 JDK 的 java.lang.reflect.Proxy 类来创立代理对象。代理对象会在运行时实现代理接口,并笼罩其中的办法,在办法调用前后执行切面逻辑(即告诉,advice)。
- CGLIB 动静代理 :对于未实现接口的类,Spring AOP 会抉择应用 CGLIB 库来生成代理对象。CGLIB 通过字节码技术创立指标类的子类,在子类中重写指标办法并在办法调用前后插入切面逻辑。
-
要害概念 :
- 切面(Aspect):切面是一个蕴含了横切关注点申明的模块化单元,它能够有多个切入点和告诉组成。
- 切入点(Pointcut):切入点定义了匹配告诉应该被织入的办法或办法执行点的规定表达式。
- 告诉(Advice):告诉是在特定切入点处执行的代码片段,分为多种类型,如前置告诉(Before advice)、后置告诉(After returning advice)、异样后告诉(After throwing advice)、最终告诉(After (finally) advice)以及盘绕告诉(Around advice)。
- 织入(Weaving):织入是指将切面利用到指标对象来创立一个新的代理对象的过程。在 Spring AOP 中,织入产生在运行时,通过代理对象的形式实现。
- 代理工厂 :Spring 外部通过 ProxyFactory 或相干的 AOP 基础设施(如 Advisor、AdvisorChainFactory 等)来创立和治理代理对象。
- 执行流程 :当客户端通过代理对象调用指标办法时,代理对象会拦挡这个调用,依据切面配置找到对应的告诉,并依照告诉类型的不同执行相应的加强逻辑。例如,如果是盘绕告诉,它会齐全管制原始办法的调用过程,能够在调用前后插入自定义逻辑,甚至决定是否执行原办法。
通过上述形式,Spring AOP 奇妙地实现了对指标对象办法的拦挡和加强,从而实现了面向切面编程的性能。
课后思考
Spring 动静代理生效的场景有哪些?Spring Boot 动静代理默认实现是 JDK 动静代理还是 CGLIB?怎么证实?
本文已收录到我的面试小站 www.javacn.site,其中蕴含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、音讯队列等模块。