超轻量级框架 Next 发布 3.0.0.0-DEBUG 版本

Cloudopt Next 是一个非常轻量级且现代的、基于 Kotlin 编写的全栈开发框架,同时支持 Java 和 Kotlin,您可以处理Url的解析,数据的封装,Json的输出等等,从根本上减少开发时间、提升开发体验。

Cloudopt Next 主要拥有以下特点:

简单 极简设计,几乎不要任何配置,不依赖 Tomcat、Jetty 等 Web 容器。

异步 基于 vertx 轻松实现高性能的异步服务。

扩展 支持 vertx 体系的各种组件,同时支持通过插件扩展功能,官方也提供了大量好用的插件。

中文 全中文文档、中文社区,帮助中文开发者快速上手。

最新版本

目前 3.0.0.0 在开发阶段,你可以直接修改 Maven 配置或 Gradle 中的依赖版本号为以下版本号即可体验最新功能。

3.0.0.0-DEBUG

依赖升级

在 3.0.0.0 中对一些基础依赖进行了全面升级, JDK 升级到 11、Vertx 升级到 4.0.0、Kotlin 升级到 1.4.0。

反射重构

对使用 Java 的开发者来说影响不大,主要是提升了 Kotlin 开发者的开发体验。

在新版中,对大部分的反射、扫描注解进行了重构。原本是使用 Java 原生的反射操作,现在全部改为了 Kotlin 原生的反射操作。改为 Kotlin 原生语法后对 Kotlin 的基础类型的支持更加友好、也避免了 Kotlin 类转回 Java 类的开销。

Classer 工具类中也进行了大量的修改,原本对指定包扫描出的 Class 都改为了 扫描出 KClass。

ClassLoader::class.java.classLoader.loadClass(className)
ClassLoader::class.java.classLoader.loadClass(className).kotlin

原本是通过 Beanner.newInstance 对扫描的类进行初始化(工具类暂未移除,建议不再使用),现在不再需要了,直接通过 KClass 中的原生方法创建实例。

handlers.add(Beaner.newInstance(clazz))  
handlers.add(clazz.createInstance() as Handler)

获取注解也不再需要额外的判断是否为 null,现在会直接通过 findAnnotation 获取到注解。

val websocketAnnotation: WebSocket = clazz.getDeclaredAnnotation(WebSocket::class.java)
val websocketAnnotation: WebSocket? = clazz.findAnnotation<WebSocket>()

判断注解是否存在,也改为了 Kotlin 原生语法。

m.getAnnotation(AfterEvent::class.java) != null
resourceTable.clazzMethod.hasAnnotation<AfterEvent>()

我们还对请求进入时调用路由方法进行了优化,原本时先需要拿到路由方法所在的类再通过方法名反射操作,现在是再扫描时就会保存 KFunction,直接调用使用。

resourceTable.clazzMethod.callBy(arr)

对路由方法参数注入上也进行了优化,原本是每一次获取参数注入的时候会创建一次 Json 对象,现在是每一次请求只创建一次,有效减少了开销。

getParaByType(para.getAnnotation(Parameter::class.java).value, para, controllerObj)?.let { arr.add(it)}

val jsonObject:JSONObject = JSONObject.toJSON(controllerObj.getParams()) as JSONObject
getParaByType(para.findAnnotation<Parameter>()?.value, para, jsonObject)?.let { arr.put(para,it) }

其次是在注入处理之前就已经保存了 Parameter 类,不再需要在注入参数时重新获取参数的类型了。以及 @Parameter 注解中的 value 不再是必填项,如果不填会自动使用变量名称。

JsonProvider 接口也进行了修改,将原本参数类型为 Class 的都改为了 KClass。DefaultJSONProvider 、Jsoner 也进行了同样的修改。

fun toObject(jsonString: String, clazz: Class<*>): Any

fun toObject(jsonString: String, clazz: KClass<*>): Any

WebSocket 更新

请使用以下新的用法。现在支持更优雅的用法,只需要继承 WebSocketResource 并实现相应的方法即可。

@WebSocket("/websocket")
class WebSocketHandler : WebSocketResource {
    override fun onConnectionSuccess(websocket: ServerWebSocket) {
        websocket.writeTextMessage("Connection successful!") {
            println("The event of after write.")
        }
        val buffer: Buffer = Buffer.buffer().appendInt(123).appendFloat(1.23f)
        websocket.writeBinaryMessage(buffer) {
            println("The event of after write binary.")
        }
    }

    override fun onConnectionFailure(throwable: Throwable) {

    }

    override fun onConnectionComplete(websocket: ServerWebSocket) {

    }

    override fun onFrameMessage(frame: WebSocketFrame, websocket: ServerWebSocket) {
        println(frame.textData())
        websocket.writeTextMessage("This is the message from the server!")
    }

    override fun onTextMessage(message: String, websocket: ServerWebSocket) {
        println(message)
        websocket.writeTextMessage("This is the message from the server!")
    }

    override fun onBinaryMessage(buffer: Buffer, websocket: ServerWebSocket) {

    }

    override fun onPingPong(buffer: Buffer, websocket: ServerWebSocket) {
        println("Pong...")
    }

    override fun onException(throwable: Throwable, websocket: ServerWebSocket) {
        throwable.printStackTrace()
        if (!websocket.isClosed) {
            websocket.close()
        }
    }

    override fun onDrain(websocket: ServerWebSocket) {

    }

    override fun onEnd(websocket: ServerWebSocket) {
        println("Connection was closed.")
    }


}

Redis 插件

原本实现的异步的 redis 插件正式从 redis 包中去除,之后可能会出一个专门供异步使用的 redis 插件。

猜你喜欢

转载自www.oschina.net/news/123393/cloudopt-next-3-0-0-0-debug-released