从外部依赖性弹簧启动自动配置顺序
我有一个问题,试图让我的自动配置工作。我有两个罐子,如下所示,每个罐子都有一个spring.factories文件,其中这两个启用了EnableAutoConfigurationProperties。从外部依赖性弹簧启动自动配置顺序
这种配置在我的包,mock.jar,这取决于下面我 - 封装 - real.jar:
package org.packages.package.packageA;
@Configuration
@AutoConfigureBefore(AutoConfigurationB.class)
public class AutoConfigurationA {
@Bean
public MyService mockService() {
return new MyMockService();
}
}
这种配置在我的包,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的时候MyService已经被定义。 但是,它在包含这些罐子的第三个项目中使用时不起作用。当从类路径加载这些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
为其注释的类的包启用了组件扫描。由于这个原因,自动配置特定的顺序不适用。
为了避免这个问题,您应该将自动配置类放入一个未被任何应用程序代码使用的包中。
谢谢安迪,那确实解决了我的问题。奇怪的想法是,当它们自己使用的配置类和@SpringBootApplication(例如,不是作为另一个项目中的依赖关系jar)都能正常工作时。我不知道这是否只是运气,或者那种情况下弹簧引导的行为不同。 Eithee的方式,答案接受。谢谢! –