Spring Fu 0.3.0 及更高版本

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

我很高兴地宣布 Spring Fu 0.3.0 现已推出。提醒一下,Spring Fu 是 Spring Boot 程序化配置的孵化器,它使用 DSL 以声明的方式通过代码明确地配置它,并通过自动完成功能实现极佳的可发现性。

JaFu 回来了!

这个新的里程碑除了 KoFu(Kotlin DSL)之外,还带来了 JaFu(Java 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()
}

配置切片

此配置模型的强大之处在于您可以定义自己的配置切片并根据需要组装它们。例如,让我们定义 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 新闻通讯保持联系

订阅

获得支持

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

了解更多信息

即将举行的活动

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

查看全部