Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 弹簧启动自动配置命令_Spring Boot - Fatal编程技术网

Spring boot 弹簧启动自动配置命令

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

在一个多模块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中的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:

  • 因为C不依赖任何东西
  • A-因为A依赖于已经创建的C
  • 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
    

    您可以显示您的主配置类吗?“已配置”是什么意思(您如何知道在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。