我在使用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.
任何人都可以指出我可能错过了什么,或者有没有其他方法可以做到这一点?首先十分感谢.
如果某些类是否在类路径中,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:
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)
| 归档时间: |
|
| 查看次数: |
10626 次 |
| 最近记录: |