首页 > 解决方案 > application.properties 不使用@EnableAutoConfiguration 和自定义spring boot starter 读取

问题描述

我尝试创建一个简单的自定义弹簧启动启动器,它读取以下属性application.properties

@EnableConfigurationProperties({ CustomStarterProperties.class })
@Configuration
public class CustomStarterAutoConfiguration {

    @Autowired
    private CustomStarterProperties properties;

    @Bean
    public String customStarterMessage() {
        return properties.getMessage();
    }
}

及其ConfigurationProperties :

@ConfigurationProperties(prefix = "custom.starter")
public class CustomStarterProperties {

    private String message;

  /* getter and setter */
           ...
}

还有相应的application.propertiesandMETA-INF/spring.factories来启用autoconfiguration

我有另一个项目将此启动器声明为依赖项,并在其中编写了一个测试以查看是否创建了 customStarterMessage Bean:

@RunWith(SpringRunner.class)
@EnableAutoConfiguration
public class TotoTest {

    @Autowired
    String customStarterMessage;

    @Test
    public void loadContext() {
        assertThat(customStarterMessage).isNotNull();
    }
}

该测试失败(即使项目中有适当的 application.properties 文件),因为application.properties似乎没有被读取。

它适用于@SpringBootTest注释而不是注释,@EnableAutoConfiguration但我想了解为什么 EnableAutoConfiguration 不使用我的 application.properties 文件,而据我了解,所有 Spring AutoConfiguration 都是基于属性的。

谢谢

标签: spring-bootpropertiesspring-boot-starter

解决方案


@EnableAutoConfiguration在测试类上没有为您准备所需的测试上下文。

@SpringBootTest根据默认规范为您设置默认测试上下文,例如从根包扫描,从默认资源加载。要从不属于根包层次结构的自定义包加载,即使在测试上下文配置中也可以从自定义资源目录加载。您的所有配置都将根据@EnableAutoConfiguration您的定义在您的实际启动项目中自动完成。


推荐阅读