AOP原理

本文对比了静态代理和动态代理的区别,重点介绍了JDK动态代理和Cglib动态代理的工作原理及适用场景。

  • 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
  • 动态代理:在程序运行时,运用反射机制动态创建而成。

静态代理:

   由程序员创建或工具生成代理类的源码,再编译代理类,即代理类和委托类的关系再程序运行前就已经存在。


动态代理

JDK的动态代理:

        就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程。

       JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,

Cglib动态代理:

cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 

### AOP(面向切面编程)工作原理 #### 定义与概念 AOP 即面向切面编程,是对 OOP 的一种补充而非替代[^1]。这种编程范式旨在处理程序中的横切关注点,即那些跨越多个模块或类的功能,比如日志记录、性能监控、安全性和事务管理等。 #### 关键术语解释 - **连接点(Join Point)**:指应用程序执行过程中的特定位置,在这里可以插入额外的行为。 - **通知(Advice)**:定义了当某个连接点被触发时应采取的动作。常见的有前置通知(Before Advice),后置返回通知(After Returning Advice),异常抛出通知(Around Advice)等。 - **切入点(Pointcut)**:用于指定哪些连接点应该应用该通知的表达式或者模式匹配规则。 - **方面(Aspect)**:包含了通知和切入点定义的对象;它是用来封装横切逻辑的地方。 - **引入(Introduction)**:允许向现有类添加新方法或属性的能力。 #### 工作流程概述 在 Java 生态系统里,Spring 框架提供了对 AOP 支持的主要实现方式——基于代理的方式以及基于注解配置的通知机制[^2]。具体来说: 对于**基于代理的 AOP**而言,Spring 使用 JDK 动态代理或是 CGLIB 库创建目标对象的目标接口/子类实例,并在其上调用的方法前后织入相应的增强处理代码片段。这种方式适用于实现了接口的服务组件。 而对于**基于注解的 AOP**, 开发者可以在源码级别上利用 `@Before`, `@AfterReturning` 等自定义元数据标签标记要拦截的操作并编写对应的处理器函数。编译期或运行时期间会自动扫描这些标注并将它们注册到容器中作为可执行单元参与后续调用链路。 最后值得注意的是,借助于 Spring AOP, 可以有效地将业务功能同通用型服务隔离开来,从而提高系统的灵活性与可维护性[^3]. ```java // 示例代码展示如何声明一个简单的 Aspect 切面 import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logMethodCall() { System.out.println("Logging method call..."); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值