2016-09-15 112 views
1

我有一个问题,试图让我的自动配置工作。我有两个罐子,如下所示,每个罐子都有一个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); 
    } 
} 

回答

0

@AutoConfigureBefore@AutoConfigureAfter只适用于当一个配置类加载过程中自动配置的结果被启用,它spring.factories被列。当您的自动配置类位于org.packages.package(或子包)中,并且您的主要应用程序类位于同一个包中时,Spring Framework的标准组件扫描会发现它们。发生这种情况是因为@SpringBootApplication为其注释的类的包启用了组件扫描。由于这个原因,自动配置特定的顺序不适用。

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

+0

谢谢安迪,那确实解决了我的问题。奇怪的想法是,当它们自己使用的配置类和@SpringBootApplication(例如,不是作为另一个项目中的依赖关系jar)都能正常工作时。我不知道这是否只是运气,或者那种情况下弹簧引导的行为不同。 Eithee的方式,答案接受。谢谢! –