Solon 特性簡集,相較於 Springboot 有什麼區別?
阿新 • • 發佈:2020-12-28
Solon 是一個類似Springboot的微型開發框架,也是一個不基於Servlet的開發框架。專案從2018年啟動以來,參考過大量前人作品;歷時兩年,3500多次的commit;核心保持0.1m的身材,超高的Web跑分,良好的使用體驗。
Solon 強調:剋制 + 簡潔 + 開放的原則;力求:更小、更快、更自由的體驗。
#### 所謂更小:
核心0.1m,最小Web開發單位0.2m(相比Springboot專案包,小到可以乎略不計了)。
具使用者反映,某些專案切換到Solon後,可以縮減到原來10%的包大小。
#### 所謂更快:
本機helloworld測試,啟動最快可達0.09s,Qps可達12萬之多。可參考:《[helloworld_wrk_test](https://gitee.com/noear/helloworld_wrk_test)》。
#### 所謂更自由:
* 程式碼操控自由:
```java
// 除了注入模式之外,還可以按需手動
//
//手動獲取配置
String userName = Solon.cfg().get("user.name");
Properties dbcfg = Solon.cfg().getProp("db");
//手動獲取容器裡的Bean
UserService userService = Aop.get(UserService.class);
//手動監聽http post請求
Solon.global().post("/user/update", x-> userService.updateById(x.paramMap()));
```
* 框架選擇自由:
可以用solon-web這樣的快速開發整合包。也可以按專案需要選擇不同的外掛組裝,比如:為非Solon專案新增solon.boot.jlhttp,0.2m即可讓專案實現http+rpc開發;還可以用MVC開發Socket應用。
#### 特性簡集:
### 1、與Springboot的常用註解比較
| Solon 1.2.12 | Springboot 2.3.3 | 說明 |
| -------- | -------- | -------- |
| @Inject * | @Autowired | 注入Bean(by type) |
| @Inject("name") | @Qualifier+@Autowired | 注入Bean(by name) |
| @Inject("${name}") | @Value("${name}") |注入配置 |
| @Component | @Component | 託管元件 |
| @Singleton | @Scope(“singleton”) | 單例(Solon 預設是單例) |
| @Singleton(false) | @Scope(“prototype”) | 非單例 |
| | | |
| @Init * | @PostConstruct | 構造完成並注入後的初始化 |
| @Configuration | @Configuration | 配置類 |
| @Bean | @Bean | 配置元件 |
| @Mapping | @RequestMapping,@GetMapping... | 對映 |
| @Param | @RequestParam | 請求引數 |
| @Controller | @Controller,@RestController | 控制器類 |
| @Service | @Service | 服務類 |
| @Dao | @Dao | 資料訪問類 |
* Solon 的 @Inject 算是: Spring 的@Value、@Autowired、@Qualifier 三者的結合,但又不完全等價
* Solon 託管的 Bean 初始化順序:new() - > @Inject - > @Init
* 注1:@Inject 的引數注入,只在Method@Bean上有效
* 注2:@Inject 的型別注入,只在@Configuration類上有效
### 2、重要的區別,Solon不是基於Servlet的開發框架
* 與Springboot相似的體驗,但使用Context包裝請求上下文。Helloworld效果如下:
```java
@Controller
public class App{
public static void main(String[] args){
Solon.start(App.class, args);
}
@Inject("${app.name}")
String appName;
@Mapping("/")
public Object home(Context c, @Param(defaultValue="noear") String name){
return appName + ": Hello " + name;
}
}
```
### 3、與Springboot相似的事務支援@Tran
* 採用Springboot相同的事件傳播機制及隔離級別
```java
@Controller
public class DemoController{
@Db
BaseMapper