领先一步
VMware 提供培训和认证,助您加速进步。
了解更多很高兴宣布 Spring Fu 0.3.0 已发布。提醒一下,Spring Fu 是一个 Spring Boot 程序化配置的孵化项目,它使用 DSLs 以声明式方式通过代码明确配置 Spring Boot,借助自动完成功能实现出色的可发现性。
这个新的里程碑版本带来了 JaFu(Java DSL),它与 KoFu(Kotlin DSL)并行存在。JaFu 在 0.1.0 版本中被移除,因为那时我没有足够的精力同时支持 Java 和 Kotlin 的 DSL,并且在 API 方面我不确定 Java 版本是否有足够的吸引力来证明这种努力是值得的。但由于各种原因,我改变了主意。
我收到了很多要求将其带回的请求
Java 作为一门语言发展得更快了
对于 Java 开发者和 Kotlin 开发者来说,对配置如何应用获得更多控制是很有趣的
函数式方法在 JVM 上自然非常高效,并且非常适合 GraalVM 本机镜像
有两位很棒的新贡献者加入了团队:专注于 KoFu 的 Audrey Neveu 和专注于 JaFu 的 Arjen Poutsma。欢迎他们!
这个新版本也是进行各种改进的机会,例如将基线升级到 Spring Boot 2.3.0 或进行 API 改进,详细的变更日志请参见此处。
Spring Fu 0.3.0 还附带了额外的优化,仅启用函数式 Web 基础设施,因此在我的笔记本电脑上,OpenJDK 11 的启动时间非常快:Started Application in 0.673 seconds (JVM running for 0.898)
。
由于 Spring MVC 现在可以通过函数式方式用于 Java 和 Kotlin,让我们看看使用这些 DSL 配置的最小 Spring Boot Web 应用是什么样的。
使用 JaFu
public class Application {
public static JafuApplication app = webApplication(a -> a.beans(b -> b
.bean(SampleHandler.class)
.bean(SampleService.class))
.enable(webMvc(w -> w
.port(w.profiles().contains("test") ? 8181 : 8080)
.router(router -> {
SampleHandler handler = w.ref(SampleHandler.class);
router
.GET("/", handler::hello)
.GET("/api", handler::json);
}).converters(c -> c
.string()
.jackson(j -> j.indentOutput(true))))));
public static void main (String[] args) {
app.run(args);
}
}
使用 KoFu
val app = webApplication {
beans {
bean<SampleService>()
bean<SampleHandler>()
}
webMvc {
port = if (profiles.contains("test")) 8181 else 8080
router {
val handler = ref<SampleHandler>()
GET("/", handler::hello)
GET("/api", handler::json)
}
converters {
string()
jackson {
indentOutput = false
}
}
}
}
fun main() {
app.run()
}
这种配置模型的强大之处在于,您可以定义自己的配置切片并根据需要组装它们。例如,让我们定义 3 个配置切片 webConfig
、loggingConfig
和 myFeatureConfig
val webConfig = configuration {
webMvc {
// ...
}
}
val loggingConfig = configuration {
logging {
level = LogLevel.WARN
}
}
val myFeatureConfig = configuration {
beans {
// ...
}
cassandra {
// ...
}
}
然后,您可以将它们全部用于常规 Web 应用
val webApp = webApplication {
enable(loggingConfig)
enable(myFeatureConfig)
enable(webConfig)
}
fun main() {
webApp.run()
}
但您也可以仅使用其中一个子集,例如用于集成测试
@Test
fun `My feature integration test`() {
val testApp = application {
enable(loggingConfig)
enable(myFeatureConfig)
}
// ...
}
在路线图方面,下一个 0.4.0 里程碑将重点关注以下方面:
通过利用 spring-init 来替换 autoconfigure-adapter 模块。spring-init 是由 Dave Syer 和 Andy Clement 创建的一个实验性项目,它可以将 Spring Boot 自动配置自动转换为函数式 bean 注册。
GraalVM 本机支持,无需反射配置(依赖于 oracle/graal#2500)
改进的 DSL 可扩展性
使用 JaFu、GraalVM native 和 Knative 的 Scale-to-zero 应用示例
利用 Spring Framework 5.3 M1 默认移除 XML 和 SpEL 支持
通过 Spring Security 5.3 官方 Kotlin DSL 提供 Spring Security 支持
一如既往,欢迎反馈。请注意,我们目前主要关注获得正确的软件设计和 API,而不是广泛覆盖更多功能。