网站建设的 几点,游戏推广渠道,代理服务网站,app企业开发公司kotlin dsl在以前的博客文章中#xff0c;我描述了Spring Web Framework中的响应式编程支持Spring Webflux如何使用基于Kotlin的DSL使用户能够以非常直观的方式描述路由。 在这里#xff0c;我想探索一些底层实现。 描述一组端点的样本DSL看起来像这样#xff1a; package… kotlin dsl 在以前的博客文章中我描述了Spring Web Framework中的响应式编程支持Spring Webflux如何使用基于Kotlin的DSL使用户能够以非常直观的方式描述路由。 在这里我想探索一些底层实现。 描述一组端点的样本DSL看起来像这样 package sample.routesimport org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.MediaType.APPLICATION_JSON
import org.springframework.web.reactive.function.server.router
import sample.handler.MessageHandlerConfiguration
class AppRoutes(private val messageHandler: MessageHandler) {Beanfun apis() router {(accept(APPLICATION_JSON) and /messages).nest {GET(/, messageHandler::getMessages)POST(/, messageHandler::addMessage)GET(/{id}, messageHandler::getMessage)PUT(/{id}, messageHandler::updateMessage)DELETE(/{id}, messageHandler::deleteMessage)}}} 为了分析样本让我从一个较小的工作示例开始 import org.junit.Test
import org.springframework.test.web.reactive.server.WebTestClient
import org.springframework.web.reactive.function.server.ServerResponse.ok
import org.springframework.web.reactive.function.server.routerclass AppRoutesTest {Testfun testSimpleGet() {val routerFunction router {GET(/isokay, { _ - ok().build() })}val client WebTestClient.bindToRouterFunction(routerFunction).build()client.get().uri(/isokay).exchange().expectStatus().isOk}
} 路由定义的核心是“路由器”功能 import org.springframework.web.reactive.function.server.router
...
val routerFunction router {GET(/isokay, { _ - ok().build() })
} 通过以下方式定义 fun router(routes: RouterFunctionDsl.() - Unit) RouterFunctionDsl().apply(routes).router() 参数“ routes”是lambda表达式的一种特殊类型 称为带接收器的Lambda表达式 。 这意味着在路由器功能的上下文中此lambda表达式只能由“ RouterFunctionDsl”实例调用这是在函数主体中使用apply方法完成的操作这也意味着在lambda表达式主体中“此”是“ RouterFunctionDsl”的实例。 知道了这一点便可以访问“ RouterFunctionDsl”的方法该方法之一就是示例中使用的GETGET的定义如下 fun GET(pattern: String, f: (ServerRequest) - MonoServerResponse) {...
} 还有其他方式表示相同的端点 GET(/isokay2)({ _ - ok().build() }) 在Kotlin中非常巧妙地实现为 fun GET(pattern: String): RequestPredicate RequestPredicates.GET(pattern)operator fun RequestPredicate.invoke(f: (ServerRequest) - MonoServerResponse) {...
} 此处使用模式的GET返回一个“ RequestPredicate”已为其定义了一个扩展函数 在DSL的上下文中称为invoke而后者又是一个特别命名的运算符 。 或第三种方式 /isokay { _ - ok().build() } 这是通过在String类型上添加扩展函数来实现的并通过以下方式定义 operator fun String.invoke(f: (ServerRequest) - MonoServerResponse) {...
} 我觉得Spring Webflux很好地利用了Kotlin DSL使其中一些路由定义易于阅读同时保持简洁。 这应该提供足够的入门知识以探索Spring Webflux中Routing DSL的源代码。 我的示例可在此处的github存储库中找到 – https://github.com/bijukunjummen/webflux-route-with-kotlin 翻译自: https://www.javacodegeeks.com/2017/09/spring-webflux-kotlin-dsl-walkthrough-implementation.htmlkotlin dsl