🔥 超神器啊!0.4Mb 就为 Java 中间件的控制台开发提供
比如你开发了个中间件(比如叫“annie”),想安排一个管理界面(比如叫:annie-admin)。后端接口想用什么开发?
<dependencies>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-boot-jdkhttp</artifactId>
</dependency>
</dependencies>
只要 0.4Mb,有 Ioc/Aop 容器;有 Mvc 支持;有 Config 管理支持;还有无限的扩展支持。
一、自由的启动
1、如果你想做为“独立应用”,我们这么启动:
public class AnnieApp{
public static void main(String[] args){
Solon.start(AnnieApp.class, args);
}
}
2、如果你想“内嵌”到 SpringBoot3 的项目里。就这么启动:
@Configuration
public class AnnieConfig {
@PostConstruct
public void start() {
//启动 solon
Solon.start(AnnieConfig.class, new String[]{"--cfg=annie.properties"}); //可以用特定的配置文件,避免与主应用冲突
}
@PreDestroy
public void stop() {
if (Solon.app() != null) {
//停止 solon(根据配置,可支持两段式安全停止)
Solon.stopBlock(false, Solon.cfg().stopDelay());
}
}
@Bean
public FilterRegistrationBean folkmqAdmin(){
//通过 Servlet Filter 实现 http 能力对接
FilterRegistrationBean<SolonServletFilter> filter = new FilterRegistrationBean<>();
filter.setName("AnnieFilter");
filter.addUrlPatterns("/annie-admin/*");
filter.setFilter(new SolonServletFilter());
return filter;
}
}
3、如果你想“内嵌”到 Vert.X 的项目里。这么启动:
public class AnnieConfig extends AbstractVerticle {
private final Router router;
private final VxWebHandler handler;
public AnnieConfig(Router router) {
this.router = router;
this.handler = new VxWebHandler();
}
@Override
public void start() {
router.routeWithRegex("/annie-admin/*").handler(req -> {
handler.handle(req.request());
});
Solon.start(AnnieConfig.class, new String[]{"--cfg=annie.properties"});
}
@Override
public void stop() {
if (Solon.app() != null) {
Solon.stopBlock(false, Solon.cfg().stopDelay());
}
}
}
4、如果你想“内嵌”到 jFinal 的项目里。这么启动:
public class AnnieConfig extends Handler implements IPlugin {
public boolean start() {
Solon.start(AnnieConfig.class, new String[]{"--cfg=annie.properties"});
return true;
}
public boolean stop() {
if (Solon.app() != null) {
Solon.stopBlock(false, Solon.cfg().stopDelay());
}
return true;
}
@Override
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
if (target.startsWith("/annie-admin/")) {
Context ctx = new SolonServletContext(request, response);
try {
//Solon处理(可能是空处理)
Solon.app().tryHandle(ctx);
if (isHandled != null && isHandled.length > 0) {
isHandled[0] = true;
}
} catch (Throwable e) {
ctx.errors = e;
throw e;
} finally {
ContextUtil.currentRemove();
}
} else {
if (next != null) {
next.handle(target, request, response, isHandled);
}
}
}
}
二、可独立、可内嵌的通用开发
- 添加配置 annie.properties
#项目配置
annie.title=Annie
#配置数据源
solon.dataSources.annie!.class=com.zaxxer.hikari.HikariDataSource
solon.dataSources.annie!.jdbcUrl=jdbc:mysql://localhost:3306/rock?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
solon.dataSources.annie!.driverClassName=com.mysql.cj.jdbc.Driver
solon.dataSources.annie!.username=demo
solon.dataSources.annie!.password=123456
再引入轻量的 sql 工具(20kb),轻量的 http 工具(40kb)
- 开发接口
@Controller
public class LoginController {
@SqlUtils
SqlUtils sqlUtils;
@Mapping("hello")
public String hello() {
return "Hello world!";
}
@Mapping("sql")
public UserDo sql(String username, String passowd) {
return sqlUtils.sql("SELECT * FROM username=? AND passowd?", username, passowd)
.queryRow()
.toBean(UserDo.class);
}
@Mapping("http")
public UserDto http(String username, String passowd) {
return HttpUtils.http("http://demo.org/user/get")
.data("username", username)
.data("passowd", passowd)
.post(UserDto.class);
}
}
更多扩展与开发内容,可参考 Solon 官网。