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/***pare-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 替换成 @***ponent
@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要改成@Db
import org.springframework.stereotype.Service; 替换成 import org.noear.solon.annotation.***ponent;
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 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结尾)//支持 ** 或 * 占位符
- "***.xxx.mapper.*" #这个表达式同上效果
- "classpath:mybatis/**/*.xml"
configuration: #扩展配置(要与 Configuration 类的属性一一对应)
cacheEnabled: false
mapperVerifyEnabled: 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("${mybatis.db1}") HikariDataSource ds) {
return ds;
}
}
详细配置参考:https://solon.noear.org/article/20
- 全局异常处理
去掉SpringBoot自带的异常处理
新增如下java类:
import org.noear.solon.annotation.***ponent;
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;
@***ponent(index = 0) //index 为顺序位(不加,则默认为0)
public class AppRouterInterceptor implements RouterInterceptor {
@Override
public 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生态