在Spring Boot 中进行属性 注入工作的充分必要条件是什么?

What are necessary and sufficient conditions for property injection work in Spring Boot?

我有以下 class:

@ConfigurationProperties
public class Database {

   ...

   @Value("${database.driver-class-name}")
   public void setDriverClassName(String driverClassName) {
      ...
   }

build.gradle中有以下依赖:

dependencies {
    compile('org.springframework.boot:spring-boot-starter-jdbc')
    compile('org.springframework.boot:spring-boot-configuration-processor')

application.properties中有以下行:

database.driver-class-name=com.mysql.jdbc.Driver

在测试中有以下注释class:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(DatabaseTest.Context.class)
@EnableConfigurationProperties
public class DatabaseTest {

   @Configuration
   public static class Context {

      @Bean
      public Database database() {
         Database ans = new Database();
         return ans;
      }

   }

   @Autowired
   public Database database;

而且它仍然没有从 属性 文件中注入属性,也没有出现错误消息。

它还想要什么?

从 属性 文件注入属性的充分必要条件是什么?

UDPATE

示例存储库:https://github.com/dims12/MinimalRequrementsToInjectPropertiesFromFile

您的 class 上的 @configurationProperties 应该有 @Bean@Component 注释,以便 spring 注入 属性 值。有关属性的更多信息,请参见 here

@ConfigurationProperties
@Component // or @Bean
public class Database {

抱歉,我自己找到了答案。

在 Spring 引导的情况下,上下文配置 class 通常用 @SpringBootApplication 注释,这会导致很多事情,包括自动查找 属性 文件的连接.这是由 @EnableAutoConfiguration 调用的,它包含在以前的注释中。

在我的例子中,我只用普通的Spring @Configuration注释注释了上下文配置class,因为我在JUnit测试中并认为它不是一个应用程序。在这种情况下,我要明确添加 @EnableAutoConfiguration

可能我也被允许用@SpringBootApplication注释上下文配置class,但我没有测试它。

@EnableConfigurationProperties 根本不需要。也不需要 @ConfigurationPropertiesAutowiredAnnotationBeanPostProcessor.