🔍 一、理清关系:思想 → 模式 → 技术
我们可以用一个清晰的层次来理解:
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
正在工作...
[拦截] 方法结束
✅ 这里:
是 AOP 的载体它通过 动态代理机制 被织入到调用链中完美体现了 “拦截器是 AOP 的一种实现方式”
LoggingInterceptor
🆚 四、拦截器 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 + DynamicProxy、Scrutor + 拦截器、或者 ASP.NET Core 的中间件/过滤器,其实都在不同层面实践着这种“拦截器式 AOP”。
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END
















暂无评论内容