写给正在做技术选型或迁移调研的 Java 开发者如果你会 Spring Boot那你已经会了一大半 Solon。Solon 不是 Spring 的分支或封装它是独立发展的全栈应用开发框架。但在设计哲学上Solon 遵循了 Java 主流的 IoC、AOP、MVC 范式---- 概念相同注解名不同。这篇文章把 Spring Boot 到 Solon 的注解映射、配置迁移、关键差异整理成对照表供迁移参考。IoC/DI 容器注解对照核心原则Solon 将 Spring 的多个细分注解合并为少数几个核心注解。组件注册Solon | Spring Boot | 说明---|---|---Component | Component / Service / Repository / Dao | Solon 统一用一个注解Configuration | Configuration | 完全一致Bean | Bean | 完全一致依赖注入Solon | Spring Boot | 说明---|---|---Inject | Autowired | 按类型注入by typeInject(name) | Qualifier Autowired | 按名称注入by nameInject(${key}) | Value(${key}) | 注入配置值BindProps(prefixxxx) | ConfigurationProperties(prefixxxx) | 绑定属性集注意Solon 的 Inject 一个注解兼顾了 Spring 中 Autowired、Qualifier、Value 三个注解的功能。生命周期与作用域Solon | Spring Boot | 说明---|---|---Init | PostConstruct | 组件初始化回调Destroy | PreDestroy | 组件销毁回调LifecycleBean | InitializingBean DisposableBean | 接口方式控制生命周期AppLoadEndEvent | ApplicationRunner / CommandLineRunner | 应用启动后执行Singleton默认 | Scope(singleton) | 单例Solon 默认Singleton(false) | Scope(prototype) | 多例Condition(...) | ConditionalOnClass / ConditionalOnProperty 等 | Solon 统一为单一注解Import | Import ComponentScan | 导入组件/配置类Web 层Controller 改写注解映射Solon | Spring Boot | 说明---|---|---Controller | Controller / RestController | Solon 默认 JSON 输出Mapping | RequestMapping | 路由映射Get Mapping | GetMapping | GET 方法限定Post Mapping | PostMapping | POST 方法限定Put Mapping | PutMapping | PUT 方法限定Delete Mapping | DeleteMapping | DELETE 方法限定Param | RequestParam | 请求参数Path | PathVariable | 路径变量Body | RequestBody | 请求体Header | RequestHeader | 请求头Cookie | CookieValue | CookieProduces | --Spring 无直接等价 | 声明输出类型Consumes | --Spring 无直接等价 | 声明输入类型Before / After 示例Spring Boot 写法RestControllerRequestMapping(/users)public class UserController {Autowiredprivate UserService userService;GetMapping(/{id})public User getUser(PathVariable Long id) {return userService.findById(id);}PostMappingpublic User create(RequestBody User user) {return userService.save(user);}}Solon 写法ControllerMapping(/users)public class UserController {Injectprivate UserService userService;GetMapping(/{id})public User getUser(Path Long id) {return userService.findById(id);}PostMappingpublic User create(Body User user) {return userService.save(user);}}关键差异Context 替代 Servlet APISolon 不依赖 Servlet 容器因此 HttpServletRequest / HttpServletResponse 需替换为 Context// Spring 写法public User get(HttpServletRequest request) {String token request.getHeader(Token);String id request.getParameter(id);}// Solon 写法public User get(Context ctx) {String token ctx.header(Token);String id ctx.param(id);// ctx.redirect(url) 重定向// ctx.render(obj) 渲染// ctx.remoteIp() 客户端 IP}⚠️ Context 只能在方法参数中注入不能作为字段注入。配置文件迁移文件命名项目 | Spring Boot | Solon---|---|---主配置文件 | application.yml | app.yml环境配置文件 | application-dev.yml | app-dev.yml激活方式 | spring.profiles.activedev | solon.envdev常用配置键名对照含义 | Spring Boot | Solon---|---|---应用名 | spring.application.name | solon.app.name端口 | server.port | server.port不变上下文路径 | server.servlet.context-path | server.contextPath数据源 | spring.datasource.url | solon.dataSources.db1.url日志级别 | logging.level.com.xx | solon.logging.level.com.xx环境切换 | spring.profiles.active | solon.env⚠️ Solon 配置键名统一使用驼峰命名contextPath不是短横线context-path。数据访问Db 一站式注入多数据源配置YAMLsolon.dataSources:db1:class: com.zaxxer.hikari.HikariDataSourceurl: jdbc:mysql://localhost/testdriverClassName: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456db2:url: jdbc:mysql://localhost/orderdriverClassName: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456Db 注入// Solon 一行搞定多数据源Db(db1) UserMapper userMapper;Db(db2) OrderMapper orderMapper;对比 Spring Boot 多数据源需要配置多个 DataSource 多个 SqlSessionFactory 多个 TransactionManager MapperScan... Solon 使用 Db。ORM 集成ORM | Spring Boot 依赖 | Solon 依赖---|---|---MyBatis | mybatis-spring-boot-starter | mybatis-solon-pluginMyBatis-Plus | mybatis-plus-spring-boot-starter | mybatis-plus-solon-pluginJPA | spring-boot-starter-data-jpa | solon-data-jpaEasy-Query | easy-query-spring-boot-starter | easy-query-solon-plugin事务Solon | Spring Boot | 说明---|---|---Transaction | Transactional | 声明式事务Transaction(policy TranPolicy.requires_new) | Transactional(propagation Propagation.REQUIRES_NEW) | 事务传播策略Solon 的 Transaction 默认遇到任何异常都回滚无需指定异常类型。测试迁移Solon | Spring Boot | 说明---|---|---SolonTest(App.class) | SpringBootTest | 测试启动SolonTest(envtest) | ActiveProfiles(test) | 测试环境HttpTester | MockMvc | HTTP 接口测试Rollback | Transactional Rollback | 事务回滚Import(profiles...) | TestPropertySource | 导入测试属性HttpTester 用法示例SolonTest(App.class)public class UserControllerTest extends HttpTester {Testpublic void testGetUser() {// GET 请求String resp path(/users/1).get();assertEquals(200, resp.code());// POST 请求String json {\name\:\test\};String resp2 path(/users).body(json).post();assertContains(resp2, test);}}其他常见对照场景 | Spring Boot | Solon---|---|---拦截器 | HandlerInterceptor | Around 注解或 Solon Filter定时任务 | Scheduled | Scheduled同名 EnableScheduling文件上传 | MultipartFile | UploadedFile用法一致RPC 调用 | FeignClient | NamiClient注册发现 | EnableDiscoveryClient | 无需注解 引入插件自动生效配置刷新 | RefreshScope | 无需注解 配置变更自动感知迁移检查清单POMspring-boot-starter-parent - solon-parentPOMspring-boot-starter-* - solon-* / *-solon-plugin配置application.yml - app.yml环境文件同理启动类SpringBootApplication - SolonMain启动SpringApplication.run() - Solon.start()IoCAutowired - InjectIoCService/Repository - ComponentWebRestController - ControllerWebRequestMapping - MappingWebPathVariable - PathWebHttpServletRequest - Context配置Value - Inject(${...})数据spring.datasource.* - solon.dataSources.*数据Transactional - Transaction测试SpringBootTest - SolonTest测试MockMvc - HttpTester写在最后这篇对照表覆盖了日常开发中最常用的 90% 场景。Solon 的注解体系并非简单的换皮它在统一性Component / Inject / Condition和简便性Db / 无需 RefreshScope上做了明显的设计取舍。建议迁移前先通读一遍官方对比文档。如有具体的迁移场景未覆盖欢迎在评论区留言。