Spring Boot 到 Solon 迁移全攻略:注解、配置、测试对照全解析!

写给正在做技术选型或迁移调研的 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 type)
`@Inject("name")` | `@Qualifier` + `@Autowired` | 按名称注入(by name)
`@Inject("${key}")` | `@Value("${key}")` | 注入配置值
`@BindProps(prefix="xxx")` | `@ConfigurationProperties(prefix="xxx")` | 绑定属性集

注意: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` | Cookie
`@Produces` | --(Spring 无直接等价) | 声明输出类型
`@Consumes` | --(Spring 无直接等价) | 声明输入类型

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);
}
}
关键差异: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` 只能在方法参数中注入,不能作为字段注入。

配置文件迁移

文件命名

项目 | Spring Boot | Solon
---|---|---
主配置文件 | `application.yml` | `app.yml`
环境配置文件 | `application-dev.yml` | `app-dev.yml`
激活方式 | `spring.profiles.active=dev` | `solon.env=dev`

常用配置键名对照

含义 | 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 一站式注入

多数据源配置(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
@Db 注入
// 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-plugin`
MyBatis-Plus | `mybatis-plus-spring-boot-starter` | `mybatis-plus-solon-plugin`
JPA | `spring-boot-starter-data-jpa` | `solon-data-jpa`
Easy-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(env="test")` | `@ActiveProfiles("test")` | 测试环境
`HttpTester` | `MockMvc` | HTTP 接口测试
`@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 Boot | Solon
---|---|---
拦截器 | `HandlerInterceptor` | `@Around` 注解或 Solon Filter
定时任务 | `@Scheduled` | `@Scheduled`(同名)+ `@EnableScheduling`
文件上传 | `MultipartFile` | `UploadedFile`(用法一致)
RPC 调用 | `@FeignClient` | `@NamiClient`
注册发现 | `@EnableDiscoveryClient` | 无需注解 ,引入插件自动生效
配置刷新 | `@RefreshScope` | 无需注解 ,配置变更自动感知

迁移检查清单

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

写在最后

这篇对照表覆盖了日常开发中最常用的 90% 场景。Solon 的注解体系并非简单的"换皮",它在统一性(`@Component` / `@Inject` / `@Condition`)和简便性(`@Db` / 无需 `@RefreshScope`)上做了明显的设计取舍。建议迁移前先通读一遍官方对比文档。如有具体的迁移场景未覆盖,欢迎在评论区留言。

内容概要:本文系统研究了基于动态三维环境下的Q-Learning算法在无人机自主避障路径规划中的应用,依托Matlab代码实现,深入剖析了强化学习在复杂、时变空间中实现智能决策的机制。研究构建了三维网格化状态空间模型,设计了合理的动作集合与奖励函数,充分考虑静态与动态障碍物的存在,使无人机能够通过与环境持续交互,自主学习规避障碍并趋近目标的最优策略。文章不仅展示了Q-Learning算法在路径规划中的具体实现流程,还涵盖了状态表示、策略迭代、收敛性分析等关键环节,并通过仿真实验验证了算法的有效性与鲁棒性,为智能体在动态环境中的自主导航提供了理论依据和技术参考。; 适合人群:具备人工智能、自动化、计算机科学或机器人学等相关专业背景,熟悉Matlab编程语言和基本的强化学习概念,从事无人机控制、智能导航、路径规划算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市峡谷、灾害现场等复杂动态三维场景中无人机的自主飞行与紧急避障;②作为强化学习解决实际路径规划问题的教学实例,帮助理解Q-Learning的核心思想、状态-动作值函数更新过程及探索-利用权衡策略;③为后续研究更先进的深度强化学习算法(如DQN、PPO)在无人机控制中的应用奠定基础和提供对比基准。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,通过调整学习率、折扣因子、探索率(ε-greedy)等超参数,观察其对算法收敛速度和最终路径规划质量的影响,并尝试修改环境复杂度(如增加障碍物密度或动态性)以评估算法的泛化能力。
内容概要:本文主要围绕“单相逆变器闭环,逆变电路PWM模型仿真研究”展开,基于Simulink平台构建单相逆变器的闭环控制系统仿真模型,重点研究脉宽调制(PWM)技术在逆变电路中的应用。通过建立精确的数学模型与控制策略,实现对输出电压的稳定调控,提升逆变器的动态响应与抗干扰能力。文中详细介绍了系统结构、PID控制器设计、PWM信号生成及反馈环节的实现过程,并通过仿真实验验证了闭环控制相较于开环控制在输出波形质量、谐波抑制和负载适应性方面的显著优势。该研究为电力电子系统中逆变器的设计与优化提供了有效的仿真依据和技术参考。; 适合人群:具备电力电子技术基础、自动控制原理知识,熟悉Simulink仿真环境,从事电气工程、新能源发电、电力系统自动化等相关领域的科研人员及高校研究生。; 使用场景及目标:①用于教学与科研中理解单相逆变器的工作原理与闭环控制机制;②为光伏并网、不间断电源(UPS)、微电网等实际工程系统的逆变器设计提供仿真支持与优化方案;③辅助完成课程设计、毕业设计或科研项目中的系统建模与控制策略验证。; 阅读建议:建议读者结合Simulink软件动手搭建模型,逐步调试控制器参数以观察系统响应变化,深入理解PID调节、PWM调制与系统稳定性之间的关系,并可进一步拓展至并网逆变器的锁相环(PLL)控制与孤岛检测等高级功能研究。
源码直接下载地址: https://pan.quark.cn/s/3de8d38110cb 智能手机市场的迅猛增长使得邮件应用逐渐演变为用户在工作和日常生活中不可或缺的工具。黑莓手机作为商务领域长期以来的领先者,其卓越的邮件客户端软件能够显著提升用户的工作效能和交流体验。Smrtmail便是这样一款应用,它不仅适配于某一特定黑莓设备,而是专门为整个黑莓设备系列设计了一套邮件管理方案。 Smrtmail的应用理念聚焦于简洁性与高效性。在提供基础的邮件收发功能之外,它还拥有精心设计的用户界面,确保所有黑莓设备用户都能体验到流畅且直观的操作感受。应用的开发充分考虑了黑莓设备的物理构造和用户使用习惯,例如黑莓9900所配备的实体键盘,在Smrtmail中能够得到充分发挥,结合快捷操作键可以迅速完成邮件的撰写与回复。不仅如此,Smrtmail的邮件过滤、分类及搜索功能同样表现出色,用户能够便捷地处理大量邮件信息,迅速找到所需邮件,从而在商务交流中保持高效。 在安性能方面,Smrtmail为黑莓用户构建了坚实的防护屏障。借助内置的加密技术,用户的数据与隐私将得到严密保护。即便在公共网络环境下使用,也能确保邮件内容的安性。对于商务人士而言,这是一个至关重要的考量因素。 尽管黑莓手机已不再是市场的主导力量,但它仍然拥有一个稳固的用户群体,特别是那些对设备的安性、稳定性以及物理键盘有着特殊要求的商务人士。对于这部分用户,Smrtmail提供的应用服务能够满足他们随时随地进行邮件处理的诉求,无论是出差期间还是商务活动时,都能保证与客户的顺畅沟通。 关于如何获取并运用Smrtmail,用户可以通过下载附带的压缩文件来获取安装程序。安装流程简便,用户只需遵循指示步骤,授权应用访问邮件...
内容概要:本文聚焦于“考虑灵活性供需不确定性的储能优化配置”,结合Matlab代码实现,系统研究电力系统中因新能源出力波动、负荷变化及多能耦合带来的灵活性挑战,提出基于多目标优化、场景生成与削减(如拉丁超立方抽样、Kantorovich距离SBR算法)、鲁棒优化与分布鲁棒优化等先进方法的储能系统优化配置方案。重点涵盖储能的选址、定容、调度策略及其在微电网、综合能源系统、虚拟电厂等场景中的集成应用,同时涉及电-热-气多能协同、需求响应建模、电动汽车协同调控等关键技术,面展示储能提升系统灵活性与可靠性的技术路径与实现手段。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员以及从事能源系统规划、运行与政策研究的工程技术人员。; 使用场景及目标:① 掌握处理新能源与负荷双重不确定性对系统灵活性影响的建模方法;② 学习并实践基于Matlab的储能系统多目标优化配置、场景削减与鲁棒调度技术;③ 应用于微电网、综合能源系统、电力市场辅助服务等实际项目中的储能规划与运行决策支持。; 阅读建议:建议结合文中提供的Matlab代码实例,重点理解不确定性建模流程、场景生成与削减算法(如LHS、SBR)、多目标优化算法(如NSGA-II)的应用逻辑,动手复现案例并尝试参数调优与模型拓展,以深入掌握储能优化配置流程技术细节与工程实现要点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值