将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生态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构学习(二)字符串

字符串 1. 概念 字符串就是特殊的字符数组&#xff0c;字符数组末尾的元素为 ‘\0’。和数组一样可以使用arr[i]或*(arri)来访问元素。 无论是用数组保存字符串&#xff08;如&#xff1a;char arr[] "Hello&#xff0c;World";&#xff09;&#xff0c;还是用指针…

汉诺塔问题(c++题解)

题目描述 1、一次只许移动一个盘 2、任何时候、任何柱子不允许把大盘放在小盘上面。 3、可使用任一一根立柱暂存圆盘。 问&#xff1a;如何使用最少步数实现n个盘子的移动&#xff1f;打印出具体移动方案。 输入格式 一行一个数n, 1< n < 18 输出格式 输出若干行…

关于HTML5表单验证的方法教程

简介 HTML5表单验证是一种在客户端对用户输入进行验证的方法&#xff0c;可以有效地减少对于服务器端验证的依赖。通过使用HTML5表单验证&#xff0c;可以为用户提供实时的错误提示和更好的用户体验。本教程将介绍如何在HTML5中使用各种验证属性和技术来实现表单验证。 基本表…

flynn发布服务小结

背景 flynn是一个基于容器的paas平台&#xff0c;可以快速的发布运行新的应用&#xff0c;用户只需要提交代码到git上&#xff0c;flynn就会基于提交的代码进行发布和部署&#xff0c;本文就简单看下flynn发布部署的流程 flynn发布服务 1.首先flynn会基于用户的web代码构建一…

Nature 研究亮点(Volume 626 Issue 8001, 29 February 2024)

文章目录 激光雕刻肥皂膜卵细胞的回收系统巴斯克语的起源产后抑郁症的治疗 激光雕刻肥皂膜 研究者&#xff1a;Haitao Xu 和 Yu Zhao&#xff0c;清华大学&#xff0c;北京。 发现&#xff1a;在特定条件下&#xff0c;可以使用激光在肥皂膜上进行雕刻。肥皂膜由洗涤剂分子&am…

AJAX 学习笔记(Day1)

「写在前面」 本文为黑马程序员 AJAX 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 AJAX 入门 1.1 AJAX 概念和 axios 使用 1.2 认识 URL 1.3 URL 查询参数 1.4 常用请求方法和数据提交 1.5 HT…

H264的打包,nal,es,pes,pts,dts,ps,ts

编码层次 视频编码层&#xff1a;预测、变换、量化、熵编码等操作slice层&#xff1a;将视频帧分割成若干个编码单元&#xff0c;包含一定数量的宏块&#xff0c;提高编解码的并行性和容错性。NAL层&#xff1a;提升对网络传输和数据存储的亲和性 视频编码层 基准-Baseline …

云计算与大数据课程笔记(一)云计算背景与介绍

如何实现一个简易搜索引擎&#xff1f; 实现一个简易的搜索引擎可以分为几个基本步骤&#xff1a;数据收集&#xff08;爬虫&#xff09;、数据处理&#xff08;索引&#xff09;、查询处理和结果呈现。下面是一个概括的实现流程&#xff1a; 1. 数据收集&#xff08;爬虫&am…

Java实战:Spring Boot项目中如何利用Redis实现用户IP接口限流

引言 在高并发的Web应用中&#xff0c;接口限流是一项至关重要的技术手段&#xff0c;它有助于保护系统资源&#xff0c;防止因瞬间流量高峰导致服务崩溃。本文将深入探讨如何在Spring Boot项目中借助Redis实现用户IP级别的接口限流策略&#xff0c;通过具体的代码示例&#x…

大数据概述

学习大数据有什么用&#xff1f; 2010年&#xff1a;大数据技术体系开始在国内火热 2015年&#xff1a;国务院印发《促进大数据发展行动纲要》 2016年&#xff1a;发改委发布关于组织实施促进大数据发展重大工程的通知 2017年&#xff1a;工信部印发大数据产业规划(2016-20…

Linux运维_Bash脚本_构建安装Meson-1.0.1和Ninja-1.11.1

Linux运维_Bash脚本_构建安装Meson-1.0.1和Ninja-1.11.1 Bash (Bourne Again Shell) 是一个解释器&#xff0c;负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件&#xff0c;并于 1989 年发布的免费软件&#xff0c;作为 Sh (Bourne Shell) 的替代品。 您…

Nginx高级技巧:实现负载均衡和反向代理

文章目录 Nginx概述Nginx作用正向代理反向代理负载均衡动静分离 Nginx的安装 -->Docker3.1 安装Nginx3.2 Nginx的配置文件3.3 修改docker-compose文件 Nginx源码安装nginx常用命令nginx配置文件配置文件位置配置文件结构详情 Nginx的反向代理【重点】基于Nginx实现反向代理4…

C语言冒泡排序(高级版)

目录: 冒泡排序的原理 主函数 "冒泡排序函数" 比较函数 交换函数 最终输出 完整代码 冒泡排序的原理: 冒泡排序的原理是&#xff1a;从左到右&#xff0c;相邻元素进行比较。每次比较一轮&#xff0c;就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右…

Windows上构建一个和Linux类似的Terminal

preview 目的是在Windows上构建一个和Linux类似的Terminal&#xff0c;让Windows炼丹和Linux一样舒适&#xff0c;同是让Terminal取代Xshell完成远程链接。 预览如下图 在Linux下我们使用zsh和oh-my-zsh结合&#xff0c;Windows下我们使用powershell7和oh-my-posh结合。 前提…

Vue 前端开发 v-for和v-if两个指令不能混合使用

原由&#xff1a; 在进行项目开发的时候因为在一个标签上同时使用了v-for和v-if两个指令导致的报错。 提示错误&#xff1a;The undefined variable inside v-for directive should be replaced with a computed property that returns filtered array instead. You should no…

nginx------------缓存功能 ip透传 负载均衡 (六)

一、http 协议反向代理 &#xff08;一&#xff09;反向代理示例:缓存功能 缓存功能可以加速访问&#xff0c;如果没有缓存关闭后端服务器后&#xff0c;图片将无法访问&#xff0c;缓存功能默认关闭&#xff0c;需要开启。 ​ proxy_cache zone_name | off; 默认off #指明调…

基于Springboot纯净水配送和商城系统设计与实现 开题报告参考

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

2023 版王道单科书勘误汇总(3.30)

注:因2023版对题目编号做了优化“历年真题全部放最后、且按年份排序”&#xff0c;以方便大家根据需要保留某些年份的真题作为最后的模拟。所以造成了一些题目和解析的编号错误。 数据结构: P11 P20 P56 P278 P326 “2.”中第 3 行”题 5改成”9”&#xff0c;第6行”题 8”改成…

css3详解

一.什么是CSS3 CSS3是Cascading Style Sheets的第三个版本&#xff0c;是一种用于描述文档样式的语言&#xff08;CSS3是CSS&#xff08;层叠样式表&#xff09;技术的升级版本&#xff09;。它是前端开发中用于控制网页布局和样式的技术之一。CSS3引入了许多新的特性和功能&a…

Linux常用操作命令大全

Linux常用操作命令大全 Linux,作为一款开源的操作系统,深受全世界开发者和系统管理员的喜爱。在Linux环境下,用户通过命令行界面可以执行各种操作,从而实现对系统的全面控制。本文将详细介绍Linux中常用的操作命令,帮助读者更好地理解和运用这些命令。 一、文件操作命令…