gpt4 book ai didi

java - 来自外部依赖的 Spring Boot 自动配置顺序

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:53 24 4
gpt4 key购买 nike

我在尝试让我的自动配置工作时遇到问题。我有如下两个 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);
}
}

最佳答案

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

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

关于java - 来自外部依赖的 Spring Boot 自动配置顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39513699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com