[spring-projects/spring-boot]Bootstrapper 的初始化方法应该命名为初始化

2024-06-26 886 views
3

此 PR 修复了 Bootstrapper 类中的一个小错误。

回答

1

感谢 @cprayer 发现这个问题并提交 PR。我们必须进行一些改进,以弃用该intitialize方法并initialize在其旁边添加该方法。希望我们可以使用一种default方法,这样它就不会成为重大更改。我们可以将其作为合并的一部分来执行。

2

@wilkinsona 谢谢你的评论。我已经按照你说的修改了代码。这个怎么样?

7

哦,亲爱的,原文中有一个令人尴尬的打字错误?。感谢 @cprayer 的发现。

2

Bootstrapper这无法处理已发布且仅实施intitialize(拼写错误)的实施者将继续工作的情况。由于已编码,它将失败。我认为SpringApplication需要继续调用已弃用的方法,直到将其删除,并且已弃用的方法需要默认调用新方法。

5

谢谢你的关注,@spencergibb。

我认为 SpringApplication 需要继续调用已弃用的方法,直到它被删除,并且已弃用的方法需要默认调用新的方法。

我认为如果我们能够进入这样一种情况,即实现者不必在弃用的方法中包含任何代码,那会更好。

initialize如果我们创建(correct) 一个default调用intitialize(typo)的方法,会不会成功?SpringApplication然后可以调用initialize(correct),默认方法会将此委托给任何现有实现的intitialize(typo)。当他们升级并注意到弃用警告时,他们可以将代码从intitialize(typo) 移到initialize(correct),并将intitialize(typo) 留空,因为它永远不会被调用。

4

Bootstrapper我想知道如果人们将其用作 lambda 的话是否会遇到二进制兼容性问题?

2

我猜我们可能需要加入一些智慧SpringApplication。我们应该调用这两种方法并进行处理NoSuchMethodError

9

无论哪种方式我都没问题,只要现有的实现者不会因为使用弃用的方法或使用了 lambda 而被破坏。

7

我想知道如果人们将 Bootstrapper 用作 lambda 是否会遇到二进制兼容性问题?

我不相信我们会。Bootstrapper当添加默认方法时,它仍然被视为功能接口,因为它仍然具有单一抽象方法。

我们可能应该调用这两种方法并处理 NoSuchMethodError。

我觉得这很危险,因为根据某人如何实现他们的Bootstrapper,它可能会导致初始化执行两次。

我认为我们可以采用default我上面概述的方法来做到这一点。

1

@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

我认为它没有二进制兼容性问题。

7

这真的很有帮助,@cprayer。谢谢。除了那项检查之外,我还在本地构建了 2.4.4-SNAPSHOT 并使用了 Spring Cloud Context 3.0.1。org.springframework.cloud.bootstrap.TextEncryptorConfigBootstrapper.intitialize(BootstrapRegistry)通过默认方法按预期调用initialize

2

感谢@wilkinsona 的检查。

6

@cprayer 非常感谢您为 Spring Boot 做出的第一次贡献。