gpt4 book ai didi

spring-boot - Spring Boot 自动配置顺序

转载 作者:行者123 更新时间:2023-12-03 14:29:28 24 4
gpt4 key购买 nike

我在多模块 Maven 项目中使用 Spring Boot 按所需顺序应用一些 Spring 配置时遇到了一些麻烦。

我有我编写的模块 A 和 B 以及对第三方模块的依赖,我在模块 C 中无法控制(依赖如下:A 依赖于 C,B 依赖于 A)

在模块 A 中,我有一个用 @Configuration 注释的类还有@AutoConfigureBefore(ClassFromModuleD.class) .在模块 B 中,我有另一个用 @Configuration 注释的类还有@AutoConfigureBefore(ClassFromModuleA.class)
我希望这会导致我的模块 B 中的 bean 定义首先被配置,然后是我的模块 A 配置类中的 bean,最后是 C 中的那些。

我还尝试添加 META-INF/spring.factories文件到模块 A 和 B 中,它声明了它自己的模块中存在的单个配置文件。例如。对于模块 A
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.exmaple.moduleAConfiguration
在模块 B 中:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.exmaple.moduleBConfiguration
我没有看到想要的配置顺序,事实上,它似乎与我想要的完全相反。我使用了日志记录语句和调试器来单步执行,似乎模块 C 中的配置首先应用,然后是 A,最后是 B。

谁能指出我可能错过了什么,或者是否有其他方法可以做到这一点?首先十分感谢。

最佳答案

如果某些类是否在类路径中,Spring AutoConfiguration 用于提供基本配置。

这用于例如如果 Hibernate 在类路径上,则提供基本的 Jpa 配置。

如果要配置spring实例化bean的顺序,可以使用

@DependsOn("A") 
public class B{
...
}

这将创建 bean“A”,而不是“B”。

但是,您想要的顺序可能是不可能的。
你写了 :

A depends on C, B depends on A



如果“取决于”意味着:A 需要 C 被实例化,
bean 必须按以下顺序创建:
  • C - 因为 C 不依赖任何东西
  • A - 因为 A 依赖于已经创建的 C。
  • B - 因为 B 依赖于已经创建的 A。

  • Spring 通过分析 bean 类自动检测依赖关系。

    如果 A 有一个 Autowiring 的属性或 C 类型的构造函数参数,spring '知道'它必须在 A 之前实例化 C。

    在大多数情况下,这非常有效。

    在某些情况下,spring 无法“猜测”依赖关系并以不需要的顺序创建 bean。
    您可以通过 @DependsOn 注释“通知”spring 关于依赖项。 Spring 将尝试相应地更改顺序。

    在您的情况下,如果您描述的依赖项对 spring 不可见,并且创建 bean 不需要依赖项,您可以尝试使用 @DependsOn 更改顺序:

    A depends on C, B depends on A



    可以实现
    @DependsOn("C") 
    public class A{
    ...
    }

    @DependsOn("A")
    public class B{
    ...
    }

    // C comes from another module
    // and no need to annotate

    关于spring-boot - Spring Boot 自动配置顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27667516/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com