我在使用Spring Boot在多模块Maven项目中以所需顺序应用一些Spring配置时遇到了一些麻烦。
我有模块A和B,由我编写,依赖于第三方模块,我在模块C中无法控制(依赖关系如下:A取决于C,B取决于A)
在模块A中,我有一个用@Configuration
和@AutoConfigureBefore(ClassFromModuleD.class)
注释的类。在模块B中,我有另一个用@Configuration
和@AutoConfigureBefore(ClassFromModuleA.class)
我希望这会导致我的模块B中的bean定义首先被配置,然后是我的模块A配置类中的bean,然后是C中的bean。
我还尝试在模块A和B中添加META-INF/spring.factories
文件,它声明了自己模块中存在的单个配置文件。例如。对于模块A
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.exmaple.moduleAConfiguration
并在模块B中:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.exmaple.moduleBConfiguration
我没有看到所需的配置顺序,事实上,它似乎与我想要的完全相反。我已经使用了日志语句和调试器来逐步执行,似乎首先应用模块C的配置,然后是A,最后是B.
有人能指出我可能错过了什么,或者是否还有另外一种方法可以做到这一点?非常感谢。
答案 0 :(得分:1)
如果某些类在类路径中,则Spring AutoConfiguration用于提供基本配置。
这用于例如如果Hibernate在类路径上,则提供基本的Jpa配置。
如果要配置spring实例化bean的顺序,可以使用
@DependsOn("A")
public class B{
...
}
这将创建bean“A”,而不是“B”。
但是,您可能无法获得所需的订单。 你写道:
A取决于C,B取决于A
如果'依赖'意味着:A需要实例化C, 必须按以下顺序创建bean:
Spring通过分析bean类自动检测依赖项。
如果A具有自动装配属性或类型C的cosntructor参数,则spring'知道'它必须在A之前实例化C。
在大多数情况下,这很有效。
在某些情况下,spring无法“猜测”依赖关系并以不需要的顺序创建bean。 你可以通过关于依赖关系的@DependsOn注释“告知”弹簧。 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