AOP 实现方式


🔍 一、理清关系:思想 → 模式 → 技术

我们可以用一个清晰的层次来理解:


AOP(面向切面编程)
│
└───▶ 实现范式 / 设计模式
      │
      ├── 代理模式(Proxy Pattern)
      │    │
      │    └───▶ 具体技术实现
      │          ├── 静态代理(手写)
      │          └── 动态代理(运行时生成)
      │                │
      │                └───▶ 拦截器(Interceptor) ← 你提到的关键点!
      │
      ├── 编译时织入(如 PostSharp、AspectJ)
      └── 源码生成(C# Source Generators)

✅ 所以:
拦截器 ⊂ 动态代理 ⊂ 代理模式 ⊂ AOP 实现方式


🧩 二、什么是拦截器?

拦截器是一个对象或方法,在目标方法被调用前后“拦截”执行流程,插入横切逻辑。

核心特点:

方法调用前/后/异常时介入可决定是否继续调用原方法(
Proceed()
)对客户端透明(通常配合动态代理使用)


💻 三、经典示例:Castle DynamicProxy 中的拦截器


// 1. 定义接口和实现(业务逻辑)
public interface IService
{
    void DoWork();
}

public class Service : IService
{
    public void DoWork() => Console.WriteLine("正在工作...");
}

// 2. 定义拦截器(AOP 横切逻辑)
public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine($"[拦截] 调用方法: {invocation.Method.Name}");
        
        try
        {
            invocation.Proceed(); // ⬅️ 继续调用真实方法(关键!)
        }
        catch (Exception ex)
        {
            Console.WriteLine($"[拦截] 发生异常: {ex.Message}");
            throw;
        }
        
        Console.WriteLine($"[拦截] 方法结束");
    }
}

// 3. 使用动态代理 + 拦截器
var generator = new ProxyGenerator();
var proxy = generator.CreateInterfaceProxyWithTarget<IService>(
    target: new Service(),
    interceptor: new LoggingInterceptor()
);

proxy.DoWork();

输出:


[拦截] 调用方法: DoWork
正在工作...
[拦截] 方法结束

✅ 这里:


LoggingInterceptor
AOP 的载体它通过 动态代理机制 被织入到调用链中完美体现了 “拦截器是 AOP 的一种实现方式


🆚 四、拦截器 vs 其他 AOP 实现方式

方式 是否使用拦截器 特点
动态代理 + 拦截器 ✅ 是 运行时灵活,.NET/Java 主流方案(如 Castle、Spring AOP)
静态代理 ❌ 否 手写代理类,无“拦截器”概念
编译时织入(PostSharp) ❌ 否 直接修改 IL,无需代理或拦截器
ASP.NET Core Action Filter ⚠️ 类似 属于 MVC 管道中的“拦截”,但非通用 AOP
MediatR Behavior ⚠️ 类似 基于管道的拦截,特定于 MediatR

🔸 所以:拦截器特指“在代理调用链中插入逻辑”的那种 AOP 实现


✅ 五、为什么拦截器如此流行?

解耦彻底:业务类完全 unaware(不知道被拦截)可组合性强:可以链式添加多个拦截器(日志 + 权限 + 缓存)运行时灵活:可根据配置动态启用/禁用符合开闭原则:新增横切逻辑无需改业务代码


🎯 六、总结

你的理解完全正确:
“拦截器只是 AOP 的一种实现方式” —— 而且是基于动态代理的、最主流的实现方式之一

更完整的表述是:

AOP 是一种将横切关注点与核心业务分离的设计思想;
代理模式是实现 AOP 的常用设计模式;
而拦截器,则是在动态代理中承载横切逻辑的具体技术组件。

这就像:

AOP 是“我想给所有门加自动锁”(思想)代理模式 是“我在门和人之间加一个智能门卫”(架构)拦截器 就是“门卫的检查规则脚本”(具体逻辑)


如果你在用 .NET,像 Autofac + DynamicProxyScrutor + 拦截器、或者 ASP.NET Core 的中间件/过滤器,其实都在不同层面实践着这种“拦截器式 AOP”。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
且听风铃的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容