跳转到内容

从 Spring Boot 迁移

Feat 的目标用户很多来自 Spring Boot。好消息是 Feat Cloud 的开发模型刻意保持了熟悉的形状:Controller、Bean、依赖注入、配置文件都在。这一页给你一张逐项对照的地图,并标出不能照搬的差异点——这些才是迁移时的真实成本所在。

Spring BootFeat Cloud说明
@RestController@ControllerFeat 不区分两类,返回值按类型自动处理(POJO 转 JSON)
@RequestMapping("/path")@RequestMapping("/path")方法级路径写法一致;类级基准路径直接写在 @Controller("users") 的值里
@GetMapping / @PostMapping 等@RequestMapping(value = "/path", method = RequestMethod.GET)没有 HTTP 方法专用的简化注解,方法限定写在 method 属性里
@PathVariable@PathParam名字变了,用法一致;路径参数只支持 :param 形式
@RequestParam@Param查询参数绑定
@Autowired@Autowired字段注入,用法一致
@Component / @Service@Bean一个注解覆盖组件分层;见 Bean 与依赖注入
@Value("${key}")@Value("${key}")写法一致,支持 ${key:默认值};不带 ${} 是字面量
@PostConstruct / @PreDestroy@PostConstruct / @PreDestroy用法一致
@CrossOrigin 等 CORS无内置见安全实践的自定义方案

一个最小对照示例:

@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> get(@PathVariable Long id) {
return ResponseEntity.ok(userService.find(id));
}
}
Spring BootFeat Cloud
application.ymlfeat.yml
application-prod.yml + spring.profiles.activefeat-prod.yml + feat.profiles.active
@ConfigurationProperties配置对象 Bean + @Value("${...}") 逐字段绑定(参考 XXL-Job 集成的 XxlJobConfig 写法)
环境变量 MY_KEY${my.key} 自动兼容环境变量 MY_KEY,规则一致

核心差异:feat.yml 是编译期输入。修改配置文件后必须重新构建(mvn clean package),而不是像 Spring 那样重启即可。这是 Feat 把装配提前到编译期的代价,换来的是启动时零扫描、零反射。机制见编译期工作模型。

Spring BootFeat Cloud备注
AOP / @Aspect@Interceptor + @AroundInvoke方法级拦截,调用 proceed() 继续、不调用即短路;无切点表达式,按注解标注目标
@ControllerAdvice 统一异常抛 HttpException 或返回 RestResult.fail(...)框架级错误统一渲染;业务级错误建议在方法内捕获后转 RestResult
Spring Session / Redis内置 Redis Session(store-type: redis)见 Session 与请求状态
DispatcherServlet无 Servlet请求直接进入 AIO 管道,没有过滤器链概念
BeanFactory 后置处理无装配在编译期生成,运行期无容器扩展点

Spring 的”全家桶”在 Feat 里没有一一对应物,按现状规划:

  1. 先用 Feat Cloud 写一个新接口,跑通快速开始的最小闭环,建立直观感受
  2. 按模块迁移而不是整体迁移:把一个内聚的业务模块(Controller + Service)搬过来,验证注解对照表中的每一项
  3. 配置逐项翻译:application.yml → feat.yml,注意每改一次就要重新构建
  4. 拦截器重写:Spring AOP 的切点表达式需要换成显式注解标注,逻辑本身平移
  5. 性能回归:迁移完成的模块用性能调优的流程确认收益

坦率地说,以下情况 Spring Boot 仍是更好的选择:

  • 深度依赖 Spring Security 的鉴权体系
  • 项目大量使用 Spring 生态的 starter(消息队列、监控、Sleuth 链路追踪等)
  • 团队没有意愿维护”非全家桶”的生态组合

Feat 的甜点区是:接口服务、高性能网关类应用、资源敏感的容器化部署、需要把 AI 能力直接嵌入 Java 后端的场景。