Spring Boot AutoConfiguration命令

时间:2014-12-27 13:06:06

标签: spring-boot

我在使用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.

有人能指出我可能错过了什么,或者是否还有另外一种方法可以做到这一点?非常感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

但是,您可能无法获得所需的订单。 你写道:

  

A取决于C,B取决于A

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

  1. C - 因为C不依赖
  2. A - 因为A取决于已经创建的C.
  3. B - 因为B取决于已经创建的A.
  4. 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