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生態