Spring Fu 0.3.0 及更高版本

版本发布 | Sébastien Deleuze | 2020 年 5 月 28 日 | ...

很高兴宣布 Spring Fu 0.3.0 已发布。提醒一下,Spring Fu 是一个 Spring Boot 程序化配置的孵化项目,它使用 DSLs 以声明式方式通过代码明确配置 Spring Boot,借助自动完成功能实现出色的可发现性。

JaFu 回归!

这个新的里程碑版本带来了 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)

比较 JaFu 和 Kofu

由于 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()
}

配置切片 (Configuration slices)

这种配置模型的强大之处在于,您可以定义自己的配置切片并根据需要组装它们。例如,让我们定义 3 个配置切片 webConfigloggingConfigmyFeatureConfig

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 里程碑将重点关注以下方面:

一如既往,欢迎反馈。请注意,我们目前主要关注获得正确的软件设计和 API,而不是广泛覆盖更多功能。

获取 Spring 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获取支持

Tanzu Spring 通过一项简单订阅提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部