Java Spring 与 JavaScript Nest 中对于 AOP/IoC/DI 的区别
·
🟦 1. AOP(面向切面编程)
AOP 的核心是:把横切关注点(cross-cutting concerns)从业务逻辑里抽离出来,例如日志、权限校验、事务管理。
在 Spring
-
实现方式
- 基于 代理模式(Proxy):默认使用 JDK 动态代理 / CGLIB。
- 方法调用会被代理对象拦截,织入横切逻辑(advice)。
-
声明方式
- 注解:
@Aspect+@Before/@After/@Around - 配置切点:
@Pointcut("execution(* com.example.service..*(..))")
- 注解:
-
应用场景:事务(
@Transactional)、日志、权限认证。
@Aspect
@Component
public class LogAspect {
@Before("execution(* com.example.service.*.*(..))")
public void beforeMethod(JoinPoint joinPoint) {
System.out.println("调用方法: " + joinPoint.getSignature().getName());
}
}
在 NestJS
-
实现方式
- 基于 装饰器 + 拦截器(Interceptor)
- AOP 的概念对应到 Nest 是 拦截器、守卫、管道。
-
声明方式
- 写一个
@Injectable()的拦截器,统一切入点(比如所有请求)。
- 写一个
-
应用场景:请求日志、响应格式化、异常处理。
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
console.log('Before...');
const now = Date.now();
return next
.handle()
.pipe(tap(() => console.log(`After... ${Date.now() - now}ms`)));
}
}
✅ 对比:
| 特性 | Spring AOP | NestJS AOP |
|---|---|---|
| 底层原理 | JDK 动态代理 / CGLIB 字节码增强 | TypeScript 装饰器 + Nest 容器拦截器 |
| 切入点定义 | 基于方法签名(Pointcut 表达式) | 基于请求处理流程(拦截器/管道/守卫) |
| 适用范围 | 更细粒度(类/方法级别) | 偏向 Web 层(请求/响应) |
| 应用场景 | 事务、日志、权限、缓存 | 日志、异常处理、请求转换 |
🟩 2. DI / IoC (依赖注入 / 控制反转)
核心思想:对象不自己创建依赖,而是由容器负责提供依赖。
在 Spring
-
实现方式
- IoC 容器:
ApplicationContext - 依赖注入方式:构造器注入 / Setter 注入 / 字段注入
- 注解:
@Autowired,@Component,@Service,@Repository
- IoC 容器:
-
例子
@Service
public class UserService {
private final UserRepository repo;
@Autowired
public UserService(UserRepository repo) {
this.repo = repo;
}
}
在 NestJS
控制反转(Inversion of Control)是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于第三方”实现具有依赖关系的对象之间的解耦。
依赖注入(Dependency Injection)是一种用于实现IoC的设计模式,它允许在类外创建依赖对象,并通过不同的方式将这些对象提供给类。
-
实现方式
- IoC 容器:Nest 内置依赖注入系统(基于 TypeScript 装饰器 + 反射 metadata)
- 注解:
@Injectable(),@Inject(),@Module() - 默认是单例注入,也可以设置
scope: TRANSIENT或scope: REQUEST
-
例子
@Injectable()
export class UserService {
constructor(private readonly repo: UserRepository) {}
}
✅ 对比:
| 特性 | Spring DI/IoC | NestJS DI/IoC |
|---|---|---|
| 底层机制 | 反射 + BeanFactory + ApplicationContext | TypeScript 装饰器 + Reflect Metadata + IoC 容器 |
| 注入方式 | 构造函数 / Setter / 字段注入 | 构造函数注入为主 |
| 配置风格 | XML(早期)+ 注解驱动 | 模块化(Module)+ 装饰器驱动 |
| 生命周期管理 | 单例 / 原型 / Request / Session | 默认单例 / Request / Transient |
| 扩展性 | BeanPostProcessor、FactoryBean 等 | 自定义 Provider、动态 Module |
🟨 总结
-
AOP
- Spring:基于 代理 & 切点表达式,更偏向于业务层方法增强(事务、缓存)。
- Nest:基于 拦截器/管道/守卫,更偏向于请求-响应链路处理(日志、异常)。
-
DI/IoC
- Spring:更重量级,Bean 生命周期管理很完善。
- Nest:更轻量,模块化清晰,依赖装饰器+TS语法糖。
更多推荐


所有评论(0)