Java 来自外部依赖项的Spring引导自动配置顺序
我在尝试进行自动配置时遇到问题。我有两个JAR,如下所示,每个JAR都有一个spring.factories文件,其中这两个JAR是为EnableAutoConfigurationProperties启用的 此配置在my-package-mock.jar中,它取决于下面的my-package-real.jar: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
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使用),它们工作正常。我不知道这是运气好,还是弹簧靴在这种情况下表现不同。以这种方式,答案被接受。谢谢