当前位置: 首页 > news >正文

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

一、写在前面

如果你会 Spring Boot,那你已经会了一大半 Solon。

Solon 不是 Spring 的分支或封装,它是独立发展的全栈应用开发框架。但在设计哲学上,Solon 遵循了 Java 主流的 IoC、AOP、MVC 范式——概念相同,注解名不同

这篇文章把 Spring Boot 到 Solon 的注解映射、配置迁移、关键差异整理成对照表,供迁移参考。

二、IoC/DI 容器:注解对照

核心原则:Solon 将 Spring 的多个细分注解合并为少数几个核心注解。

2.1 组件注册

SolonSpring Boot说明
@Component@Component/@Service/@Repository/@DaoSolon 统一用一个注解
@Configuration@Configuration完全一致
@Bean@Bean完全一致

2.2 依赖注入

SolonSpring Boot说明
@Inject@Autowired按类型注入(by type)
@Inject("name")@Qualifier+@Autowired按名称注入(by name)
@Inject("${key}")@Value("${key}")注入配置值
@BindProps(prefix="xxx")@ConfigurationProperties(prefix="xxx")绑定属性集

注意:Solon 的@Inject一个注解兼顾了 Spring 中@Autowired@Qualifier@Value三个注解的功能。

2.3 生命周期与作用域

SolonSpring Boot说明
@Init@PostConstruct组件初始化回调
@Destroy@PreDestroy组件销毁回调
LifecycleBeanInitializingBean+DisposableBean接口方式控制生命周期
AppLoadEndEventApplicationRunner/CommandLineRunner应用启动后执行
@Singleton(默认)@Scope("singleton")单例(Solon 默认)
@Singleton(false)@Scope("prototype")多例
@Condition(...)@ConditionalOnClass/@ConditionalOnPropertySolon 统一为单一注解
@Import@Import+@ComponentScan导入组件/配置类

三、Web 层:Controller 改写

3.1 注解映射

SolonSpring Boot说明
@Controller@Controller/@RestControllerSolon 默认 JSON 输出
@Mapping@RequestMapping路由映射
@Get+@Mapping@GetMappingGET 方法限定
@Post+@Mapping@PostMappingPOST 方法限定
@Put+@Mapping@PutMappingPUT 方法限定
@Delete+@Mapping@DeleteMappingDELETE 方法限定
@Param@RequestParam请求参数
@Path@PathVariable路径变量
@Body@RequestBody请求体
@Header@RequestHeader请求头
@Cookie@CookieValueCookie
@Produces—(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 API

Solon不依赖 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.active=devsolon.env=dev

4.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 多数据源配置(YAML)

solon.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: 123456

5.2 @Db 注入

// Solon 一行搞定多数据源 @Db("db1") UserMapper userMapper; @Db("db2") OrderMapper orderMapper;

对比 Spring Boot 多数据源需要配置:多个DataSource+ 多个SqlSessionFactory+ 多个TransactionManager+@MapperScan...Solon 使用@Db

5.3 ORM 集成

ORMSpring Boot 依赖Solon 依赖
MyBatismybatis-spring-boot-startermybatis-solon-plugin
MyBatis-Plusmybatis-plus-spring-boot-startermybatis-plus-solon-plugin
JPAspring-boot-starter-data-jpasolon-data-jpa
Easy-Queryeasy-query-spring-boot-startereasy-query-solon-plugin

5.4 事务

SolonSpring Boot说明
@Transaction@Transactional声明式事务
@Transaction(policy = TranPolicy.requires_new)@Transactional(propagation = Propagation.REQUIRES_NEW)事务传播策略

Solon 的@Transaction默认遇到任何异常都回滚,无需指定异常类型。

六、测试迁移

SolonSpring Boot说明
@SolonTest(App.class)@SpringBootTest测试启动
@SolonTest(env="test")@ActiveProfiles("test")测试环境
HttpTesterMockMvcHTTP 接口测试
@Rollback@Transactional+@Rollback事务回滚
@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
拦截器HandlerInterceptor@Around注解或 Solon Filter
定时任务@Scheduled@Scheduled(同名)+@EnableScheduling
文件上传MultipartFileUploadedFile(用法一致)
RPC 调用@FeignClient@NamiClient
注册发现@EnableDiscoveryClient无需注解,引入插件自动生效
配置刷新@RefreshScope无需注解,配置变更自动感知

八、迁移检查清单

  • POM:spring-boot-starter-parentsolon-parent
  • POM:spring-boot-starter-*solon-*/*-solon-plugin
  • 配置:application.ymlapp.yml(环境文件同理)
  • 启动类:@SpringBootApplication@SolonMain
  • 启动:SpringApplication.run()Solon.start()
  • IoC:@Autowired@Inject
  • IoC:@Service/@Repository@Component
  • Web:@RestController@Controller
  • Web:@RequestMapping@Mapping
  • Web:@PathVariable@Path
  • Web:HttpServletRequestContext
  • 配置:@Value@Inject("${...}")
  • 数据:spring.datasource.*solon.dataSources.*
  • 数据:@Transactional@Transaction
  • 测试:@SpringBootTest@SolonTest
  • 测试:MockMvcHttpTester

九、写在最后

这篇对照表覆盖了日常开发中最常用的 90% 场景。Solon 的注解体系并非简单的"换皮",它在统一性(@Component/@Inject/@Condition)和简便性(@Db/ 无需@RefreshScope)上做了明显的设计取舍。

http://www.jsqmd.com/news/1092012/

相关文章:

  • GPT-5.5编程实测:三个真实任务告诉你5.5比4o强在哪
  • 基础知识-DNS服务
  • ISO7520C/ISO7521C数字隔离器:电容隔离原理、选型设计与工业应用实战
  • 从零构建PHP文件上传漏洞靶场:深入理解攻防原理与安全实践
  • 逻辑严谨吗?8款AI论文写作软件排行榜,毕业冲刺必备!
  • vue页面打印printjs实现与进阶方案
  • c语言项目驱动学习--实例化(图书管理)--003-代码对比
  • 文件上传漏洞实战:从CVE-2024-50623复现到安全防御
  • 【JAVA毕设源码分享】基于springboot校园学生健康监测管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 仅限首批200名Go工程师获取:ChatGPT Go SDK v0.8.0内部预览版+32页《生产环境熔断降级配置清单》
  • 人性/移动机器人IMU模组—-高精度姿态解算方案,选型入口➡️
  • 从零到一:TeX Live 2024与TeXstudio一站式安装配置指南(含疑难杂症排查)
  • 大学生求职网站怎么选?HR实测|吉鹿力招聘网应届生求职全攻略
  • 2026新手八字排盘软件怎么选:先看概念拆解、练习路径和隐私边界
  • Python异步编程asyncio深入解析
  • Java毕业设计-基于 Spring Boot 的电影售票系统的设计与实现 基于 Spring Boot 的影院售票管理系统设计与开发(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 基于JPBC库实现国密SM9标识密码算法:Java工程实践指南
  • Minecraft世界修复终极指南:轻松拯救你的方块世界
  • Spring Boot Starter 开发规范
  • 揭秘AI专著撰写:借助AI工具,高效完成20万字专著创作之路!
  • 终极RimWorld性能优化指南:使用Performance Fish告别游戏卡顿
  • Legacy iOS Kit终极指南:如何让老旧iOS设备重获新生
  • Java的ProcessHandle进程句柄与子进程管理的现代化API
  • YOLO轻量化与部署优化- 第79篇:Web端部署:ONNX.js与TensorFlow.js应用
  • 如何用MicroPython BLE HID库构建智能无线控制解决方案:从理论到实践
  • 告别AI技术门槛:企业私有化AI训练推理一体工作站DLTM让企业自建视觉识别能力
  • 【GPT模型代际跃迁关键节点】:GPT-4o不是小升级,而是架构重构——详解流式推理引擎与MoE轻量化设计
  • LeNet-5 是什么
  • 阿里云灵积SDK深度解析:打造.NET生态的AI开发利器
  • 技术决策树的选择路径分析