将SpringBoot项目改造成solon项目

2024-03-02 14:52

本文主要是介绍将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项目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/766490

相关文章

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("