Java 来自外部依赖项的Spring引导自动配置顺序

Java 来自外部依赖项的Spring引导自动配置顺序,java,spring,jar,spring-boot,Java,Spring,Jar,Spring Boot,我在尝试进行自动配置时遇到问题。我有两个JAR,如下所示,每个JAR都有一个spring.factories文件,其中这两个JAR是为EnableAutoConfigurationProperties启用的 此配置在my-package-mock.jar中,它取决于下面的my-package-real.jar: package org.packages.package.packageA; @Configuration @AutoConfigureBefore(AutoConfigurationB

我在尝试进行自动配置时遇到问题。我有两个JAR,如下所示,每个JAR都有一个spring.factories文件,其中这两个JAR是为EnableAutoConfigurationProperties启用的

此配置在my-package-mock.jar中,它取决于下面的my-package-real.jar:

package org.packages.package.packageA;
@Configuration
@AutoConfigureBefore(AutoConfigurationB.class)
public class AutoConfigurationA {

    @Bean
    public MyService mockService() {
        return new MyMockService();
    }
}
此配置位于my-package-real.jar中:

package org.packages.package.packageB;
@Configuration
@ConditionalOnMissingBean(MyService.class)
public class AutoConfigurationB {

    @Bean
    public MyService realService() {
        return new MyRealService();
    }
}
现在的想法是,如果包含my-package-mock.jar,那么自动配置B将不会被处理,因为A在它到达B之前就被命令了,并且在它到达B之前,MyService已经被定义了。 但是,在包含这些JAR的第三个项目中使用时,它不起作用。从类路径加载这些JAR时,似乎跳过了AutoConfigureOrder注释,并且这些配置按照jvm加载这些类的顺序进行处理。在我的特殊情况下,它首先执行B,此时MyService还没有定义,因此将实例化realservicebean。我怎样才能让它工作

显然,这是一个很小的例子,其中模拟上的@Primary注释可以完成这项工作,但这不是我想要的

编辑:如果@SpringBootApplication注释的main不是这些配置所在的包的一部分,那么一切都可以正常工作。例如,注释不在“org.packages.package”中,而是在“org.somewheres”中,然后事情就开始了

package org.packages.package;

@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) throws Exception {
    SpringApplication.run(Collections.singletonList(TestApplication.class).toArray(), args);
    }
}

@AutoConfigureBefore
@AutoConfigureAfter
仅在由于启用了自动配置而加载了配置类并且该配置类列在
spring.factories
中时适用。当您的自动配置类位于
org.packages.package
(或子包)中,并且您的主应用程序类位于同一个包中时,Spring Framework的标准组件扫描会找到它们。之所以会出现这种情况,是因为
@SpringBootApplication
为其注释的类的包启用了组件扫描。因此,特定于自动配置的订购不适用


为了避免这个问题,您应该将自动配置类放在任何应用程序代码都不使用的包中。

谢谢Andy,这确实解决了我的问题。奇怪的是,当配置类和@SpringBootApplication单独使用时(例如,在另一个项目中不作为依赖项jar使用),它们工作正常。我不知道这是运气好,还是弹簧靴在这种情况下表现不同。以这种方式,答案被接受。谢谢