跨领域能力迁移 - 面试题库


一、基础题 ⭐

Q1. ASP.NET Core 和 Spring Boot 在依赖注入上有什么区别?

答案:ASP.NET Core 内置了轻量级 DI 容器,通过 IServiceCollection 注册服务,支持三种生命周期:Transient(每次请求创建新实例)、Scoped(每个 HTTP 请求一个实例)、Singleton(整个应用生命周期一个实例)。Spring Boot 基于 Spring Framework 的 IoC 容器,功能更强大,支持 @Component@Service@Repository 等注解自动扫描注册,生命周期包括 Singleton(默认)、Prototype(每次创建新实例)、Request、Session 等。Spring 还支持 @Qualifier@Primary 解决注入冲突,以及 @Configuration 类进行 Java Config 配置。两者核心理念相同,但 Spring 的生态更成熟,支持 AOP、条件注入等高级特性。 关联知识点:依赖注入、IoC 容器、服务生命周期

Q2. Entity Framework Core 和 JPA/Hibernate 在 ORM 映射上有什么异同?

答案:两者都是主流的 ORM 框架,核心功能相似。EF Core 使用 Fluent API 或 Data Annotations 进行映射,通过 DbContext 管理实体和数据库会话,支持 Code First、Database First 模式。JPA/Hibernate 使用 @Entity@Table@Column 等注解或 XML 配置,通过 EntityManager 管理持久化上下文。差异在于:EF Core 的 LINQ 查询语法更直观,支持强类型查询;Hibernate 的 HQL/JPQL 更灵活,支持更复杂的关联查询。EF Core 的 Change Tracker 自动跟踪实体状态,Hibernate 有类似的 Session 脏检查机制。两者都支持懒加载、级联操作、乐观锁等特性。 关联知识点:ORM 映射、实体状态管理、查询语言

Q3. WPF 的 MVVM 模式和前端 Vue/React 的组件化有什么共通之处?

答案:MVVM(Model-View-ViewModel)和前端组件化都遵循关注点分离原则。WPF 的 ViewModel 通过 INotifyPropertyChanged 实现数据绑定,前端通过响应式系统(Vue 的 ref/reactive、React 的 useState)实现视图更新。共通点:1)数据驱动视图更新,避免直接操作 DOM/UI 元素;2)组件/控件可复用,通过 Props/DependencyProperty 传递数据;3)事件/命令模式处理用户交互(WPF 的 ICommand 对应前端的 @click/onClick)。差异在于:WPF 依赖 XAML 声明式 UI,前端使用 JSX/模板;前端生态有更丰富的状态管理方案(Vuex、Redux)。掌握 MVVM 后迁移到前端组件化开发学习成本较低。 关联知识点:MVVM 模式、数据绑定、组件化架构

Q4. 什么是 RESTful API?.NET Web API 和 Spring MVC 如何实现?

答案:RESTful API 是基于 HTTP 协议的架构风格,使用标准方法(GET 查询、POST 创建、PUT 更新、DELETE 删除)操作资源,通过 URL 标识资源,返回 JSON/XML 格式数据。.NET Web API 使用 [ApiController][Route][HttpGet] 等特性定义路由和处理方法,通过 IActionResult 返回响应。Spring MVC 使用 @RestController@RequestMapping@GetMapping 等注解,通过 ResponseEntity 或直接返回对象(自动序列化为 JSON)。两者都支持路由参数绑定、请求体反序列化、过滤器/拦截器处理横切关注点(日志、鉴权)。核心差异在于配置风格:.NET 偏特性标注,Spring 偏注解驱动。 关联知识点:REST 架构、HTTP 协议、路由配置


二、进阶题 ⭐⭐

Q5. 如何从 .NET 的 Middleware 迁移到 Spring 的 Filter/Interceptor?

答案:.NET Middleware 通过 app.Use() 注册到请求管道,按注册顺序执行,可访问 HttpContext 进行请求/响应拦截。Spring 提供两种机制:Filter(OncePerRequestFilter)作用于 Servlet 层,拦截所有请求;Interceptor(HandlerInterceptor)作用于 Spring MVC 层,仅拦截 Controller 请求。迁移要点:1).NET 的 InvokeAsync(HttpContext, next) 对应 Filter 的 doFilter(request, response, chain);2)异常处理:.NET 用 try-catch 包装 await next(),Spring 用 @ControllerAdvice + @ExceptionHandler;3)注册方式:.NET 在 Program.cs 链式调用,Spring 通过 @ComponentWebMvcConfigurer 注册。两者都支持短路(.NET 直接 return,Spring 不调用 chain.doFilter)。 关联知识点:请求管道、拦截器、横切关注点

Q6. EF Core 的 Include 懒加载和 JPA 的 EntityGraph 有什么区别?

答案:EF Core 的 Include 用于显式加载关联实体,支持链式调用 ThenInclude 实现多级加载,默认使用 JOIN 查询(可配置为分割查询)。EF Core 5+ 支持懒加载,需安装 Microsoft.EntityFrameworkCore.Proxies 并在实体导航属性上使用 virtual。JPA 默认懒加载关联实体(FetchType.LAZY),通过 @EntityGraph 可显式指定抓取策略,避免 N+1 问题。差异:1)EF Core 的 Include 在查询时指定,JPA 的 @EntityGraph 可在 Repository 方法上声明;2)EF Core 支持 AsSplitQuery() 避免笛卡尔积,JPA 通过 @BatchSize 批量加载;3)懒加载实现:EF Core 依赖代理拦截,JPA 依赖 Hibernate 的字节码增强或代理。两者都需注意 N+1 问题。 关联知识点:关联查询、N+1 问题、懒加载/预加载

Q7. .NET 的 gRPC 服务和 Spring Cloud gRPC 如何互通?

答案:gRPC 基于 Protocol Buffers 定义服务契约,语言无关,因此 .NET 和 Spring 可无缝互通。实现步骤:1)定义 .proto 文件,声明 service、rpc、message;2).NET 端使用 Grpc.AspNetCore 生成服务端代码,通过 GrpcService<T> 实现;3)Spring 端使用 grpc-spring-boot-starter 生成代码,实现 XXXGrpc 接口;4)双方通过 HTTP/2 通信,序列化/反序列化由 Protobuf 自动处理。注意事项:1)确保 .proto 版本一致;2)拦截器/拦截器链可传递 metadata(类似 HTTP Header);3)超时、重试、负载均衡需客户端配置;4)Spring Cloud 可集成 Consul/Nacos 实现服务发现,.NET 需手动配置或使用 YARP 反向代理。 关联知识点:gRPC、Protocol Buffers、跨语言通信

Q8. WPF 的 Command 模式如何映射到前端的状态管理?

答案:WPF 的 ICommand 封装了操作逻辑和可执行状态,通过 CanExecute 控制 UI 可用性,Execute 执行操作。前端状态管理中,类似概念包括:1)Redux 的 Action + Reducer:Action 描述意图,Reducer 纯函数更新状态,类似 Command 的不可变性;2)Vue 的 Computed + Watch:Computed 类似 CanExecute 的派生状态,Watch 监听变化触发副作用类似 Execute;3)RxJS 的 Observable:通过流处理事件,pipe(filter, map) 实现条件执行。迁移要点:将 Command 的 CanExecuteChanged 映射为响应式状态更新,将 Execute 映射为异步 Action(如 Redux Thunk、Vue Composition API 的 async 函数)。核心思想都是解耦 UI 和业务逻辑。 关联知识点:Command 模式、响应式编程、状态管理

Q9. 如何将 .NET 的 BackgroundService 迁移到 Spring 的 @Async/@Scheduled?

答案:.NET 的 BackgroundService 继承自 IHostedService,通过 ExecuteAsync 实现后台任务,支持优雅关闭。Spring 提供多种方案:1)@Scheduled 注解实现定时任务,通过 @EnableScheduling 启用,支持 cron 表达式、fixedRate、fixedDelay;2)@Async 注解实现异步任务,需配置 ThreadPoolTaskExecutor;3)ApplicationRunner/CommandLineRunner 实现启动时执行一次的后台任务。迁移要点:1).NET 的 CancellationToken 对应 Spring 的中断标志或自定义停止逻辑;2)定时任务:.NET 用 PeriodicTimer,Spring 用 @Scheduled;3)异常处理:两者都需捕获异常避免任务终止;4)Spring 可通过 @EnableAsync + 自定义 Executor 控制并发度。 关联知识点:后台任务、定时任务、异步编程

Q10. .NET 的 Polly 和 Spring 的 Resilience4j 在容错处理上有什么异同?

答案:两者都是容错库,提供重试、熔断、限流、超时等策略。Polly 是 .NET 生态的标准方案,通过策略链 Policy.Handle<Exception>().Retry().CircuitBreaker() 组合使用,支持上下文传递和策略包装。Resilience4j 是 Spring Cloud 推荐的容错库,基于函数式编程,通过 Retry.of(), CircuitBreaker.of() 创建实例,配合 @Retry, @CircuitBreaker 注解使用。差异:1)Polly 策略是对象组合,Resilience4j 更偏向装饰器模式;2)Resilience4j 集成 Spring Cloud Config 支持动态配置,Polly 需手动实现;3)熔断器状态:两者都支持 Closed/Open/HalfOpen,但指标暴露方式不同(Resilience4j 集成 Micrometer,Polly 需自定义);4)两者都支持 fallback 降级逻辑。 关联知识点:容错模式、熔断器、重试策略


三、高级题 ⭐⭐⭐

Q11. 如何设计跨 .NET 和 Spring 的统一鉴权方案?

答案:统一鉴权需解决协议适配、令牌传递、权限模型映射。推荐方案:1)采用 OAuth2/OIDC 作为统一认证协议,使用 JWT 作为令牌格式,双方都能验证签名;2)部署统一身份提供商(如 Keycloak、Auth0),.NET 使用 Microsoft.AspNetCore.Authentication.JwtBearer,Spring 使用 spring-boot-starter-oauth2-resource-server;3)权限模型:将角色/权限声明放入 JWT 的 claims,.NET 通过 User.IsInRole() 检查,Spring 通过 @PreAuthorize("hasRole('ADMIN')") 控制;4)跨域场景:使用 API Gateway 统一鉴权后转发,或通过 BFF(Backend for Frontend)模式聚合;5)令牌刷新:统一使用 Refresh Token 流程,避免频繁认证。关键点:确保双方 JWT 验证算法、时钟容忍度、Issuer 配置一致。 关联知识点:OAuth2/OIDC、JWT、权限模型、API Gateway

Q12. EF Core 和 Hibernate 在分布式事务中如何保证一致性?

答案:分布式事务需解决跨数据库/服务的一致性。方案:1)两阶段提交(2PC):EF Core 通过 TransactionScope + MSDTC 支持,Hibernate 通过 JTA 实现,但性能差、不推荐;2)Saga 模式:将事务拆分为多个本地事务,通过补偿操作回滚,.NET 可用 MassTransit Saga,Spring 可用 Spring State Machine 或 Seata;3)最终一致性:通过消息队列保证事件投递,.NET 用 CAP 框架,Spring 用 Spring Cloud Stream + 本地消息表;4)TCC 模式:Try-Confirm-Cancel,需业务实现三个接口。推荐 Saga + 事件溯源:每个服务维护事件表,异步发布事件,下游服务消费并执行本地事务,失败时触发补偿。关键点:幂等性设计、补偿逻辑可靠性、事件去重。 关联知识点:分布式事务、Saga 模式、最终一致性、事件溯源

Q13. 从 WPF 桌面应用迁移到 Web 应用,架构上需要注意什么?

答案:桌面到 Web 的迁移涉及架构范式转变:1)状态管理:WPF 是富客户端,状态在本地;Web 是无状态 HTTP,需引入 Session/Redis 存储状态,或采用 SPA + API 分离架构;2)通信模式:WPF 直接调用本地服务,Web 需通过 HTTP/gRPC 调用后端,需处理网络延迟、超时、重试;3)安全性:WPF 信任本地环境,Web 需防范 XSS、CSRF、SQL 注入,引入 HTTPS、CORS、内容安全策略;4)部署:WPF 是单机安装,Web 需容器化部署、负载均衡、CDN 加速;5)离线能力:WPF 天然支持,Web 需引入 PWA/Service Worker;6)UI 响应性:WPF 用异步避免阻塞 UI 线程,Web 用异步 API + 前端乐观更新。建议采用渐进式迁移,先抽离业务逻辑为独立库,再适配 Web 层。 关联知识点:架构迁移、无状态设计、Web 安全、PWA

Q14. 如何统一 .NET 和 Spring 的日志、链路追踪和监控体系?

答案:统一可观测性需标准化三个层面:1)日志:双方都输出 JSON 格式,包含 TraceId、SpanId、时间戳、级别、消息,通过 Serilog(.NET)和 Logback/Log4j2(Spring)配置,统一采集到 ELK/Loki;2)链路追踪:集成 OpenTelemetry SDK,.NET 使用 OpenTelemetry.Instrumentation.AspNetCore,Spring 使用 opentelemetry-spring-boot-starter,统一上报到 Jaeger/Zipkin,确保 W3C TraceContext 协议一致;3)指标监控:.NET 用 System.Diagnostics.Metrics,Spring 用 Micrometer,统一暴露 Prometheus 格式指标,Grafana 配置统一 Dashboard;4)日志关联:通过 TraceId 串联日志和追踪,异常时自动附加上下文。关键点:采样率统一、敏感信息脱敏、日志级别动态调整。 关联知识点:OpenTelemetry、分布式追踪、可观测性、Prometheus

Q15. 设计一个支持 .NET 和 Spring 混合部署的微服务网关,需要考虑什么?

答案:混合部署网关需解决:1)路由分发:基于路径/域名/权重路由到不同技术栈服务,使用 YARP(.NET)或 Spring Cloud Gateway,支持动态路由配置;2)协议转换:内部服务可能用 gRPC/HTTP,网关统一暴露 REST/GraphQL,需做协议适配;3)负载均衡:集成 Consul/Nacos 服务发现,支持轮询、加权、最少连接策略,健康检查需兼容双方健康端点(.NET /health,Spring /actuator/health);4)限流熔断:网关层统一限流(令牌桶/漏桶),下游服务各自熔断,避免级联故障;5)认证透传:网关统一鉴权后,将用户信息通过 Header 传递给下游,双方需解析相同格式;6)灰度发布:基于 Header/权重分流,支持 A/B 测试;7)日志追踪:网关生成 TraceId 并传递,确保全链路可追踪。 关联知识点:API Gateway、服务发现、灰度发布、协议转换