Spring Boot AutoConfiguration命令

Dav*_*vid 9 spring-boot

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

我有模块A和B,由我编写,依赖于第三方模块,我无法在模块C中控制(依赖关系如下:A取决于C,B取决于A)

在模块AI中有一个带有注释的类@Configuration,也有@AutoConfigureBefore(ClassFromModuleD.class).在模块BI有另一个类注解为@Configuration和也@AutoConfigureBefore(ClassFromModuleA.class)

我希望这会导致我的模块B中的bean定义首先被配置,然后是我的模块A配置类中的bean,然后是C中的bean.

我还尝试向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.

任何人都可以指出我可能错过了什么,或者有没有其他方法可以做到这一点?首先十分感谢.

Ste*_*com 5

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

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

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

@DependsOn("A") 
public class B{
...    
}
Run Code Online (Sandbox Code Playgroud)

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

但是,您想要的订单可能无法实现。你写了 :

A依赖于C,B依赖于A

如果“依赖”意味着:A 需要实例化 C,则必须按以下顺序创建 bean:

  1. C - 因为 C 不依赖任何东西
  2. A - 因为 A 依赖于已经创建的 C。
  3. B - 因为 B 依赖于已经创建的 A。

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

如果 A 具有自动装配的属性或类型为 C 的构造函数参数,则 spring '知道'它必须在 A 之前实例化 C。

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

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

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

A依赖于C,B依赖于A

可以实现

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

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

// C comes from another module
// and no need to annotate
Run Code Online (Sandbox Code Playgroud)