Spring Fu 0.3.0 及后续版本

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

我很高兴地宣布 Spring Fu 0.3.0 已发布。 提醒一下,Spring Fu 是一个用于通过DSL 以编程方式配置 Spring Boot 的实验性项目,以便以声明式的方式使用代码显式配置它,从而通过自动补全获得出色的可发现性。

JaFu 回归了!

这个新的里程碑除了 KoFu (Kotlin DSL) 之外,还带回了 JaFu (Java DSL)。JaFu 在 0.1.0 版本中被移除,因为当时我没有精力同时支持 Java 和 Kotlin DSL,并且在 API 方面,我不确定 Java 版本是否足够吸引人来证明这项工作的合理性,但出于各种原因,我已经改变了主意。

  • 我收到了很多要求将其带回来的反馈。

  • Java 语言的进步更快。

  • 对于 Java 和 Kotlin 开发者来说,能够更好地控制配置的加载方式是很有吸引力的。

  • 函数式方法在 JVM 上自然非常高效,并且与 GraalVM 原生镜像非常契合。

  • 两位优秀的新贡献者加入了团队:Audrey Neveu,专注于 KoFu;Arjen Poutsma,专注于 JaFu。欢迎他们!

其他改进

本次新发布还带来了各种改进,例如 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()
}

配置切片

这种配置模型的强大之处在于您可以定义自己的配置切片并根据需要进行组合。例如,让我们定义三个配置切片 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 里程碑将侧重于:

  • 通过利用 Dave Syer 和 Andy Clement 创建的实验性项目 spring-init 来替换 autoconfigure-adapter 模块,该项目会自动将 Spring Boot 自动配置转换为函数式 Bean 注册。

  • GraalVM 原生镜像支持(无需反射配置)(取决于 oracle/graal#2500)

  • 改进的 DSL 可扩展性。

  • 使用 JaFu、GraalVM 原生镜像和 Knative 构建的 Scale-to-zero 应用程序示例。

  • 利用 Spring Framework 5.3 M1 默认移除 XML 和 SpEL 支持。

  • 通过 Spring Security 5.3 官方 Kotlin DSL 支持 Spring Security。

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

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

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

查看所有