【问题标题】:Spring Boot auto configuration order from external dependency来自外部依赖的 Spring Boot 自动配置顺序
【发布时间】:2017-01-23 15:11:13
【问题描述】:

我在尝试使我的自动配置正常工作时遇到问题。我有如下两个 jar,每个都有一个 spring.factories 文件,其中这两个为 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 包含在内,则 AutoConfigurationB 将不会被处理,因为 A 被命令在它到达 B 之前,并且在它到达 B 时已经定义了 MyService。 但是,当在包含这些 jar 的第三个项目中使用时,它不起作用。从类路径加载这些 jar 时,似乎跳过了 AutoConfigureOrder 注释,并且这些配置按照 jvm 加载这些类的顺序进行处理。在我的特定情况下,它首先执行 B 并且此时 MyService 尚未定义,因此将实例化 RealService bean。我怎样才能让它工作?

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

编辑:如果 @SpringBootApplication 注释的 main 不是这些配置所在的包的一部分,那么事情就会起作用。例如。注释不在“org.packages.package”中,而是在“org.somewhereelse”中,然后一切正常。

package org.packages.package;

@SpringBootApplication
public class TestApplication {

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

【问题讨论】:

    标签: java spring jar spring-boot


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢安迪,这确实解决了我的问题。奇怪的想法是,当配置类和 @SpringBootApplication 都单独使用时(例如,不作为另一个项目中的依赖 jar),它们可以正常工作。我不知道这是否只是运气,或者在这种情况下 spring-boot 的行为不同。无论哪种方式,答案都被接受。谢谢!
    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2018-07-26
    • 1970-01-01
    • 2015-08-20
    相关资源
    最近更新 更多