此 PR 修复了 Bootstrapper 类中的一个小错误。
[spring-projects/spring-boot]Bootstrapper 的初始化方法应该命名为初始化
回答
感谢 @cprayer 发现这个问题并提交 PR。我们必须进行一些改进,以弃用该intitialize
方法并initialize
在其旁边添加该方法。希望我们可以使用一种default
方法,这样它就不会成为重大更改。我们可以将其作为合并的一部分来执行。
@wilkinsona 谢谢你的评论。我已经按照你说的修改了代码。这个怎么样?
哦,亲爱的,原文中有一个令人尴尬的打字错误?。感谢 @cprayer 的发现。
Bootstrapper
这无法处理已发布且仅实施intitialize
(拼写错误)的实施者将继续工作的情况。由于已编码,它将失败。我认为SpringApplication
需要继续调用已弃用的方法,直到将其删除,并且已弃用的方法需要默认调用新方法。
谢谢你的关注,@spencergibb。
我认为 SpringApplication 需要继续调用已弃用的方法,直到它被删除,并且已弃用的方法需要默认调用新的方法。
我认为如果我们能够进入这样一种情况,即实现者不必在弃用的方法中包含任何代码,那会更好。
initialize
如果我们创建(correct) 一个default
调用intitialize
(typo)的方法,会不会成功?SpringApplication
然后可以调用initialize
(correct),默认方法会将此委托给任何现有实现的intitialize
(typo)。当他们升级并注意到弃用警告时,他们可以将代码从intitialize
(typo) 移到initialize
(correct),并将intitialize
(typo) 留空,因为它永远不会被调用。
Bootstrapper
我想知道如果人们将其用作 lambda 的话是否会遇到二进制兼容性问题?
我猜我们可能需要加入一些智慧SpringApplication
。我们应该调用这两种方法并进行处理NoSuchMethodError
。
无论哪种方式我都没问题,只要现有的实现者不会因为使用弃用的方法或使用了 lambda 而被破坏。
我想知道如果人们将 Bootstrapper 用作 lambda 是否会遇到二进制兼容性问题?
我不相信我们会。Bootstrapper
当添加默认方法时,它仍然被视为功能接口,因为它仍然具有单一抽象方法。
我们可能应该调用这两种方法并处理 NoSuchMethodError。
我觉得这很危险,因为根据某人如何实现他们的Bootstrapper
,它可能会导致初始化执行两次。
我认为我们可以采用default
我上面概述的方法来做到这一点。
@wilkinsona 我编写了一个简单的代码来确保二进制兼容性问题。它使用 openjdk 1.8.0_252、intellij idea community 2021.3.1 和 gradle。
第一个版本(https://github.com/cprayer/binary-compatibility-test-first-version)
主程序
package org.example;
public class Main {
public static void main(String[] args) {
Typo typo = () -> "hello world";
Test test = new Test();
test.test(typo);
System.out.println(typo.typpo());
}
}
测试.java
package org.example;
public class Test {
public void test(Typo typo) {
System.out.println(typo.typpo());
}
}
Typo.java
package org.example;
public interface Typo {
String typpo();
}
第一版结果
shasum -a 256 first/build/classes/java/main/org/example/Main.class
11425f57f59d52ef0076638eb71d7478d6be2ab4a9e2b9ff5d1f89872022a7d4 first/build/classes/java/main/org/example/Main.class
第二个版本(https://github.com/cprayer/binary-compatibility-test-second-version)
主程序
package org.example;
public class Main {
public static void main(String[] args) {
Typo typo = () -> "hello world";
Test test = new Test();
test.test(typo);
System.out.println(typo.typpo());
}
}
测试.java
package org.example;
public class Test {
public void test(Typo typo) {
System.out.println(typo.typo());
}
}
Typo.java
package org.example;
public interface Typo {
String typpo();
default String typo() {
return typpo();
}
}
第二版结果
shasum -a 256 second/build/classes/java/main/org/example/Main.class
11425f57f59d52ef0076638eb71d7478d6be2ab4a9e2b9ff5d1f89872022a7d4 second/build/classes/java/main/org/example/Main.class
我认为它没有二进制兼容性问题。
这真的很有帮助,@cprayer。谢谢。除了那项检查之外,我还在本地构建了 2.4.4-SNAPSHOT 并使用了 Spring Cloud Context 3.0.1。org.springframework.cloud.bootstrap.TextEncryptorConfigBootstrapper.intitialize(BootstrapRegistry)
通过默认方法按预期调用initialize
。
感谢@wilkinsona 的检查。
@cprayer 非常感谢您为 Spring Boot 做出的第一次贡献。