🟦 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
  • 例子

@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: TRANSIENTscope: 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

🟨 总结

  1. AOP

    • Spring:基于 代理 & 切点表达式,更偏向于业务层方法增强(事务、缓存)。
    • Nest:基于 拦截器/管道/守卫,更偏向于请求-响应链路处理(日志、异常)。
  2. DI/IoC

    • Spring:更重量级,Bean 生命周期管理很完善。
    • Nest:更轻量,模块化清晰,依赖装饰器+TS语法糖。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐