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

将SpringBoot项目改造成solon项目

solon项目介绍

官网

Java “生态型”应用开发框架:更快、更小、更简单。 启动快 5 ~ 10 倍;并发高 2~ 3 倍; 内存省 1/3 ~
1/2;打包缩到 1/2 ~ 1/10;同时支持 java8, java11, java17, java21;支持 graalvm
native image。

本文介绍如何把SpringBoot项目改造成solon

在决定改造之前最好充分对比下自己的项目与solon的区别,建议先看下这篇文章:https://solon.noear.org/article/compare-springboot

具体改造步骤如下:

  • 备份代码

如果是采用git管理代码最好新开一个分支进行操作

替换根pom.xml parent部分(如果没有则加上)

<parent><groupId>org.noear</groupId><artifactId>solon-parent</artifactId><version>2.6.5</version><relativePath />
</parent>

新增如下依赖

	<dependency><groupId>org.noear</groupId><artifactId>solon-api</artifactId></dependency><dependency><groupId>org.noear</groupId><artifactId>solon.web.cors</artifactId></dependency><dependency><groupId>org.noear</groupId><artifactId>solon.logging.logback</artifactId></dependency><dependency><groupId>org.noear</groupId><artifactId>mybatis-solon-plugin</artifactId></dependency>

全局替换

使用IDE自带的全局替换功能进行替换

  • 替换注解

@Service 替换成 @Component
@Value 替换成 @Inject
@RequestMapping 替换成 @Mapping
@GetMapping 替换成 @Get @Mapping
@PostMapping 替换成 @Post @Mapping
@PutMapping 替换成 @Put @Mapping
@DeleteMapping 替换成 @Delete @Mapping
@PathVariable 替换成 @Path
@RestController 替换成 @Controller
@PostConstruct 替换成 @Init

  • 替换import
import org.springframework.beans.factory.annotation.Autowired; 替换成 mport org.noear.solon.annotation.Inject; 
//这里需要注意,如果是Mapper要改成@Dbimport org.springframework.stereotype.Service; 替换成 import org.noear.solon.annotation.Component;import org.springframework.context.annotation.Configuration; 替换成 import org.noear.solon.annotation.Configuration;import org.springframework.web.bind.annotation.RestController; 替换成 import org.noear.solon.annotation.Controller;import org.springframework.web.bind.annotation.RequestMapping; 替换成 import org.noear.solon.annotation.Mapping;import org.springframework.web.bind.annotation.PathVariable; 替换成 import org.noear.solon.annotation.Path;import org.springframework.web.bind.annotation.RequestBody; 替换成 空字符串(什么都不填)import javax.annotation.PostConstruct; 替换成 import org.noear.solon.annotation.Init;

至此注解已经替换得差不多了,接下来改造其它特性

  • 更换启动类

删除或者注释SpringBoot启动类,新增一个App.java

内容如下:

import com.gitee.gen.config.ConnectionHandler;
import org.noear.solon.Solon;
import org.noear.solon.web.cors.CrossFilter;public class App {public static void main(String[] args) {Solon.start(App.class, args, app->{});}}
  • 跨域设置

注释SpringBoot的跨越配置

新增maven依赖

<dependency><groupId>org.noear</groupId><artifactId>solon.web.cors</artifactId>
</dependency>

启动类添加:

public static void main(String[] args) {Solon.start(App.class, args, app->{// 跨域设置app.filter(-1, new CrossFilter().allowedOrigins("*")); //加-1 优先级更高});
}
  • 数据库配置(mybatis)

resources下新增文件app.yml

新增数据库配置

# 配置数据源
mybatis.db1:url: driverClassName: userName: password: # 配置数据源对应的 mybatis 信息(要与 DataSource bean 的名字对上)
mybatis.db1:mappers:        #支持包名 或 类名(大写开头 或 *)或 xml(.xml结尾)//支持 ** 或 * 占位符- "com.xxx.mapper.*" #这个表达式同上效果- "classpath:mybatis/**/*.xml"configuration:  #扩展配置(要与 Configuration 类的属性一一对应)cacheEnabled: falsemapperVerifyEnabled: true #如果为 true,则要求所有 mapper 有 @Mapper 主解mapUnderscoreToCamelCase: true

新增一个配置类

import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;@Configuration
public class Config {//此下的 db1 与 mybatis.db1 将对应在起来 //可以用 @Db("db1") 注入mapper//typed=true,表示默认数据源。@Db 可不带名字注入@Bean(name = "db1", typed = true)public DataSource db1(@Inject("${demo.db1}") HikariDataSource ds) {return ds;}
}

详细配置参考:https://solon.noear.org/article/20

  • 全局异常处理

去掉SpringBoot自带的异常处理

新增如下java类:

import org.noear.solon.annotation.Component;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.Handler;
import org.noear.solon.core.route.RouterInterceptor;
import org.noear.solon.core.route.RouterInterceptorChain;
import org.noear.solon.validation.ValidatorException;@Component(index = 0) //index 为顺序位(不加,则默认为0)
public class AppRouterInterceptor implements RouterInterceptor {@Overridepublic void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable {try {chain.doIntercept(ctx, mainHandler);if (mainHandler == null) {ctx.render(Action.err("资源不存在"));}} catch (ValidatorException e) {ctx.render(Action.err(e.getMessage())); //e.getResult().getDescription()} catch (Throwable e) {ctx.render(Action.err(e.getMessage()));}}
}

统一异常处理具体参考:https://solon.noear.org/article/503

  • 接口重定向
@Controller
public class HomeController {// 浏览器访问http://localhost:8080 跳转到 http://localhost:8080/index.html@Get@Mapping("/")public void index(Context context) {context.redirect("index.html");}}
  • 静态资源映射

SpringBoot中的静态资源映射方式如下:

public void addResourceHandlers(ResourceHandlerRegistry registry) {// 效果:将本地dist静态目录代理为网页根目录,类似于nginx的网页代理String frontRoot = "/home/project/app/dist";registry.addResourceHandler("/index.html").addResourceLocations(frontLocation + "/index.html");registry.addResourceHandler("/favicon.ico").addResourceLocations(frontLocation + "/favicon.ico");registry.addResourceHandler("/static/**").addResourceLocations(frontLocation + "/static/");
}

solon方式如下:

maven添加依赖

<dependency><groupId>org.noear</groupId><artifactId>solon.web.staticfiles</artifactId>
</dependency>

启动类添加配置

public static void main(String[] args) {Solon.start(App.class, args, app->{// 跨域设置app.filter(-1, new CrossFilter().allowedOrigins("*")); //加-1 优先级更高// 静态资源代理String frontRoot = "/home/project/app/dist";StaticMappings.add("/", new FileStaticRepository(frontRoot));});
}

至此整个项目已经改造得差不多了,如果有其它特性需要改造,可以参考官方例子进行更改,参见:solon生态

相关文章:

将SpringBoot项目改造成solon项目

solon项目介绍 官网 Java “生态型”应用开发框架&#xff1a;更快、更小、更简单。 启动快 5 &#xff5e; 10 倍&#xff1b;并发高 2&#xff5e; 3 倍&#xff1b; 内存省 1/3 ~ 1/2&#xff1b;打包缩到 1/2 ~ 1/10&#xff1b;同时支持 java8, java11, java17, java21&a…...

更详细的软件测试理论基础:流程,开发、测试模型,测试分类,测试用例及其设计方法,缺陷

文章目录 一、测试流程二、开发模型1、 瀑布模型2、增量模型3、快速模型4、其他 三、测试模型1、V模型2、W模型 四、测试分类五、测试用例 test case六、测试用例设计方法1、等价类划分法2、边界值分析法3、因果图法4、判定表法5、正交法6、场景法7、流程分析法8、错误推测法方…...

input css padding

这样控件会跑出外套控件在HTML JSP里面是经常出现的。但有些外国adobe的as控件不存在这种情况&#xff0c;这是因为内层控件定义的时候不能超出外层控件的范围。 修改下&#xff1a;去掉原来css padding&#xff0c;然后加上宽度和高度...

如何打印 springboot 框架中 接收请求的日志

在 Spring Boot 框架中&#xff0c;您可以使用日志来记录接收请求和发送响应的详细信息。Spring Boot 默认使用 SLF4J&#xff08;Simple Logging Facade for Java&#xff09;作为日志抽象层&#xff0c;并支持多种日志实现&#xff0c;如 Logback、Log4j2 等。以下是一种常见…...

JVM的内存区域划分

JVM即Java虚拟机&#xff0c;是Java实现跨平台交互能力的核心&#xff0c;Java编译后的.class文件&#xff0c;就是通过虚拟机和操作系统进行交互的&#xff1b; 常见的虚拟机有&#xff1a;JVM、VMwave、Virtual Box&#xff0c;目前最主流使用的JVM是HotSpot VM&#xff1b;…...

YOLOv9有效改进|使用动态蛇形卷积Dynamic Snake Convolution

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 使用ICCV2023中的动态蛇形卷积替换YOLOv9网络中的Conv模块。 二、Dynamic Snake Convolution模块详解 2.1 模块简介 应用场景&#x…...

设计模式学习笔记 - 设计原则 - 1.单一职责原则

前言 前面我们提到过 SOLID 原则&#xff0c;实际上 SOLID 由 5 个设计原则组成&#xff0c;分别是&#xff1a;单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖反转原则。它们分别对应 SLOID 中的 S、O、L、I、D 这 5 个英文字母。 今天来学习下 SOLID 原则中的第…...

飞天使-学以致用-devops知识点4-SpringBoot项目CICD实现(实验失败,了解大概流程)

文章目录 代码准备创建jenkins 任务测试推送使用项目里面的jenkinsfile 进行升级操作 文字版本流程项目构建 代码准备 推送代码到gitlab 代码去叩叮狼教育找 k8s 创建jenkins 任务 创建一个k8s-cicd-demo 流水线任务 将jenkins 里面构建时候的地址还有token&#xff0c; 给到…...

使用HTML5画布(Canvas)模拟图层(Layers)效果

使用HTML5画布&#xff08;Canvas&#xff09;模拟图层&#xff08;Layers&#xff09;效果 在图形处理和计算机图形学中&#xff0c;图层&#xff08;Layers&#xff09;是指将图像分成不同的可独立编辑、组合和控制的部分的技术或概念。每个图层都可以包含不同的图形元素、效…...

违背祖训,微软骚操作强制用户更新至 Win 11 23H2

话说&#xff0c;大伙儿有让 Windows 操作系统一直保持最新版习惯吗&#xff1f; 根据以往惯例&#xff0c;Windows 系统更新是个比较玄学的存在&#xff0c;谁也不能保证随手更新后会不会出现什么奇葩 Bug。 因此对于不少同学来说&#xff0c;Windows 更新到一个稳定版本后&a…...

MISRA C++ 2023指南:您需要了解的一切

MISRA C 2023可以帮助使用现代C语言的组织开发安全关键型软件。使用新的MISRA标准&#xff0c;开发人员可以通过确保和记录其软件应用程序的MISRA合规性&#xff0c;满足IEC 6108或ISO 26262等功能安全标准给出的静态分析要求。 什么是MISRA C2023? 以便使用C17进行安全可靠…...

Vue:【亲测可用】父组件数组包对象,传给子组件对象,子组件修改属性(字段)后,父组件没有更新

场景&#xff1a;vue中父组件数组包对象&#xff0c;传给子组件对象&#xff0c;子组件修改属性&#xff08;字段&#xff09;后&#xff0c;父组件没有更新 代码&#xff1a; # 父组件 <div v-for"(object, name, index) in arr" :key"index"><…...

hbase学习十:客户端实现与Meta表解析

1、客户端实现 hbase社区的客户端一般是java客户端。 HBase也支持Shell交互式客户端。Shell客户端实质是用JRuby(用Java编写的Ruby解释器,方便Ruby脚本跑在JVM虚拟机上)脚本调用官方HBase客户端来实现的。因此,各种客户端的核心实现都在社区Java版本客户端上。 客户端访…...

《OpenScene: 3D Scene Understanding with Open Vocabularies》阅读笔记1

传统的3D场景理解方法依赖于带标签的3D数据集,用于训练一个模型以进行单一任务的监督学习。我们提出了OpenScene,一种替代方法,其中模型在CLIP特征空间中预测与文本和图像像素共同嵌入的3D场景点的密集特征。这种零样本方法实现了与任务无关的训练和开放词汇查询。例如,为了…...

数据结构 - Trie树(字符串统计、最大异或对)

文章目录 前言Part 1&#xff1a;Trie字符串统计1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2&#xff1a;最大异或对1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍Trie树的常见应用&#xff0c;包括&#xff1a;Trie…...

2. vue 工程创建

1. 基于 vite创建 官方文档: https://v3.cn.vuejs.org/guide/installation.html#vite vite官网: https://vitejs.cn 使用vite创建的优势&#xff1a; 开发环境中&#xff0c;无需打包操作&#xff0c;可快速的冷启动。轻量快速的热重载(HMR)。真正的按需编译&#xff0c;不再…...

2024绿色能源、城市规划与环境国际会议(ICGESCE 2024)

2024绿色能源、城市规划与环境国际会议(ICGESCE 2024) 一、【会议简介】 随着全球气候变化和环境问题日益严重&#xff0c;绿色能源和可持续发展已成为全球关注的焦点。本次会议旨在汇聚全球在绿色能源、城市规划与环境领域的专家、学者和实践者&#xff0c;共同探讨和分享关于…...

0门槛电子画册制作

​电子画册制作&#xff0c;门槛低至零&#xff0c;也可以制作出如此精美的电子画册吗&#xff1f;别担心&#xff0c;这个问题早已解决&#xff0c;今天就教你如何0门槛制作电子画册。 选择合适的企业宣传册制作软件&#xff0c;如FLBOOK在线制作电子杂志平台等。这个工具提供…...

C语言----冒泡排序进阶

冒泡排序大家应该到写过吧。但大家可能知道到的冒泡排序有两种方法。而我呢&#xff0c;最近学习到了另外一种方法&#xff0c;现在知道三种方法了。所以想与大家分享一下。但是缺点是第三种是第二种的自实现版。第一种就是我们平常写的普通冒泡排序。第二种就是qsort。第三种就…...

【机器学习】实验5,AAAI 会议论文聚类分析

本次实验以AAAI 2014会议论文数据为基础&#xff0c;要求实现或调用无监督聚类算法&#xff0c;了解聚类方法。 任务介绍 每年国际上召开的大大小小学术会议不计其数&#xff0c;发表了非常多的论文。在计算机领域的一些大型学术会议上&#xff0c;一次就可以发表涉及各个方向…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...