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 官网。