外部依赖项

时间:2016-09-15 14:28:10

标签: java spring jar spring-boot

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

1 个答案:

答案 0 :(得分:2)

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

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