Spring boot 弹簧启动自动配置命令
在一个多模块Maven项目中,我在使用Spring Boot以期望的顺序应用一些Spring配置时遇到了一些问题 我有由我编写的模块A和B,以及对第三方模块的依赖关系,我在模块C中无法控制该模块(依赖关系如下:A依赖于C,B依赖于A) 在模块A中,我有一个用Spring boot 弹簧启动自动配置命令,spring-boot,Spring Boot,在一个多模块Maven项目中,我在使用Spring Boot以期望的顺序应用一些Spring配置时遇到了一些问题 我有由我编写的模块A和B,以及对第三方模块的依赖关系,我在模块C中无法控制该模块(依赖关系如下:A依赖于C,B依赖于A) 在模块A中,我有一个用@Configuration注释的类,还有@AutoConfigureBefore(ClassFromModuleD.class)。在模块B中,我有另一个用@Configuration注释的类,还有@AutoConfigureBefore(C
@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.moduleConfiguration
在模块B中:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.exmaple.moduleBConfiguration
我没有看到理想的配置顺序,事实上,它似乎与我想要的正好相反。我使用了日志语句和调试器来逐步执行,似乎首先应用了模块C中的配置,然后是a,最后是B
有没有人能指出我可能遗漏了什么,或者是否有其他方法可以做到这一点?非常感谢。如果某些类在类路径中或不在类路径中,Spring自动配置用于提供基本配置 例如,如果Hibernate位于类路径上,则可以使用它来提供基本的Jpa配置 如果要配置spring实例化bean的顺序,可以使用
@DependsOn("A")
public class B{
...
}
这将创建bean“A”,而不是“B”
但是,您想要的订单可能不可能实现。
你写道:
A依赖于C,B依赖于A
如果“依赖于”意味着:A需要实例化C,
必须按照以下顺序创建bean:
@DependsOn("C")
public class A{
...
}
@DependsOn("A")
public class B{
...
}
// C comes from another module
// and no need to annotate
您可以显示您的主配置类吗?“已配置”是什么意思(您如何知道在euntime时一件事先于另一件事)?主配置类如下:
@enablerreactor@springbootplication公共类SpringConfiguration{}
我相信顺序不是我想要的,因为我在各种bean定义方法中放置了断点,它们没有按照我希望的顺序被命中。问题是,模块C中的一个bean试图在上下文中查找一个尚未出现的bean,因为它是由模块a和模块B配置的,而模块a和模块B尚未自动配置。。。如果我一步一步地完成模块C的代码运行,然后在一段时间后配置bean(太晚了)!AutoconfigureBefore/After
注释仅适用于类导入bean工厂的顺序。他们没有说明bean的创建顺序,所以你的断点并没有真正帮助你理解问题。如果不能创建一个bean,那么肯定会有一个错误和堆栈跟踪,因此发布这些可能会有所帮助?为什么模块C中的bean在上下文中“查找”一个bean(我假设这意味着调用getBean
),而不是让容器自动连接所述bean。后者还将确保在模块C中的bean之前创建所需的bean。