Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚

📅 2026/6/29 21:57:28
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
一、写在前面如果你会 Spring Boot那你已经会了一大半 Solon。Solon 不是 Spring 的分支或封装它是独立发展的全栈应用开发框架。但在设计哲学上Solon 遵循了 Java 主流的 IoC、AOP、MVC 范式——概念相同注解名不同。这篇文章把 Spring Boot 到 Solon 的注解映射、配置迁移、关键差异整理成对照表供迁移参考。二、IoC/DI 容器注解对照核心原则Solon 将 Spring 的多个细分注解合并为少数几个核心注解。2.1 组件注册SolonSpring Boot说明ComponentComponent/Service/Repository/DaoSolon 统一用一个注解ConfigurationConfiguration完全一致BeanBean完全一致2.2 依赖注入SolonSpring Boot说明InjectAutowired按类型注入by typeInject(name)QualifierAutowired按名称注入by nameInject(${key})Value(${key})注入配置值BindProps(prefixxxx)ConfigurationProperties(prefixxxx)绑定属性集注意Solon 的Inject一个注解兼顾了 Spring 中Autowired、Qualifier、Value三个注解的功能。2.3 生命周期与作用域SolonSpring Boot说明InitPostConstruct组件初始化回调DestroyPreDestroy组件销毁回调LifecycleBeanInitializingBeanDisposableBean接口方式控制生命周期AppLoadEndEventApplicationRunner/CommandLineRunner应用启动后执行Singleton默认Scope(singleton)单例Solon 默认Singleton(false)Scope(prototype)多例Condition(...)ConditionalOnClass/ConditionalOnProperty等Solon 统一为单一注解ImportImportComponentScan导入组件/配置类三、Web 层Controller 改写3.1 注解映射SolonSpring Boot说明ControllerController/RestControllerSolon 默认 JSON 输出MappingRequestMapping路由映射GetMappingGetMappingGET 方法限定PostMappingPostMappingPOST 方法限定PutMappingPutMappingPUT 方法限定DeleteMappingDeleteMappingDELETE 方法限定ParamRequestParam请求参数PathPathVariable路径变量BodyRequestBody请求体HeaderRequestHeader请求头CookieCookieValueCookieProduces—Spring 无直接等价声明输出类型Consumes—Spring 无直接等价声明输入类型3.2 Before / After 示例Spring Boot 写法RestController RequestMapping(/users) public class UserController { Autowired private UserService userService; GetMapping(/{id}) public User getUser(PathVariable Long id) { return userService.findById(id); } PostMapping public User create(RequestBody User user) { return userService.save(user); } }Solon 写法Controller Mapping(/users) public class UserController { Inject private UserService userService; Get Mapping(/{id}) public User getUser(Path Long id) { return userService.findById(id); } Post Mapping public User create(Body User user) { return userService.save(user); } }3.3 关键差异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只能在方法参数中注入不能作为字段注入。四、配置文件迁移4.1 文件命名项目Spring BootSolon主配置文件application.ymlapp.yml环境配置文件application-dev.ymlapp-dev.yml激活方式spring.profiles.activedevsolon.envdev4.2 常用配置键名对照含义Spring BootSolon应用名spring.application.namesolon.app.name端口server.portserver.port不变上下文路径server.servlet.context-pathserver.contextPath数据源spring.datasource.urlsolon.dataSources.db1.url日志级别logging.level.com.xxsolon.logging.level.com.xx环境切换spring.profiles.activesolon.env⚠️ Solon 配置键名统一使用驼峰命名contextPath不是短横线context-path。五、数据访问Db 一站式注入5.1 多数据源配置YAMLsolon.dataSources: db1: class: com.zaxxer.hikari.HikariDataSource url: jdbc:mysql://localhost/test driverClassName: com.mysql.cj.jdbc.Driver username: root password: 123456 db2: url: jdbc:mysql://localhost/order driverClassName: com.mysql.cj.jdbc.Driver username: root password: 1234565.2 Db 注入// Solon 一行搞定多数据源 Db(db1) UserMapper userMapper; Db(db2) OrderMapper orderMapper;对比 Spring Boot 多数据源需要配置多个DataSource 多个SqlSessionFactory 多个TransactionManagerMapperScan...Solon 使用Db。5.3 ORM 集成ORMSpring Boot 依赖Solon 依赖MyBatismybatis-spring-boot-startermybatis-solon-pluginMyBatis-Plusmybatis-plus-spring-boot-startermybatis-plus-solon-pluginJPAspring-boot-starter-data-jpasolon-data-jpaEasy-Queryeasy-query-spring-boot-startereasy-query-solon-plugin5.4 事务SolonSpring Boot说明TransactionTransactional声明式事务Transaction(policy TranPolicy.requires_new)Transactional(propagation Propagation.REQUIRES_NEW)事务传播策略Solon 的Transaction默认遇到任何异常都回滚无需指定异常类型。六、测试迁移SolonSpring Boot说明SolonTest(App.class)SpringBootTest测试启动SolonTest(envtest)ActiveProfiles(test)测试环境HttpTesterMockMvcHTTP 接口测试RollbackTransactionalRollback事务回滚Import(profiles...)TestPropertySource导入测试属性HttpTester 用法示例SolonTest(App.class) public class UserControllerTest extends HttpTester { Test public 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 BootSolon拦截器HandlerInterceptorAround注解或 Solon Filter定时任务ScheduledScheduled同名EnableScheduling文件上传MultipartFileUploadedFile用法一致RPC 调用FeignClientNamiClient注册发现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上做了明显的设计取舍。