静态配置对象的Spring autowire失败

时间:2018-04-30 12:00:58

标签: java spring spring-boot dependency-injection static

作为Spring新手,我尝试将外部配置加载到Configuration-Object中,然后尝试自动装配。

以下是我的设置细分到最低限度(较少字段aso): 包结构:

app
  |--Application.java
app.configuration
  |--ConfigProperties.java

我的 configuration.properties 驻留在:

src/main/resources/config

Application.java:

package app;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import app.configuration.ConfigProperties;

@SpringBootApplication
public class Application
{
    //just to test if autowire works
    @Autowired
    public static ConfigProperties config;

    public static void main(String[] args)
    {
        SpringApplication.run(Application.class, args);

        System.out.println(config.getId());
    }
}

ConfigProperties.java:

package app.configuration;

import javax.validation.constraints.NotBlank;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.validation.annotation.Validated;

@Configuration
@PropertySource("classpath:/config/configuration.properties")
@ConfigurationProperties
@Validated
public class ConfigProperties
{

    @NotBlank
    private String id;

    public String getId()
    {
        return id;
    }

    public void setId(String id)
    {
        this.id = id;
    }

}

这会导致行的NullPointerException:

System.out.println(config.getId());

在Apllication.java中。

我阅读了几个关于这个主题的帖子,但是最明显的是自己的实例化会阻止自动装配,我没有这样做,或者扫描无法找到要自动装配的类,而是从我用我的注释和包结构读取的内容不应该是问题。

我的错误在哪里?

PS:似乎从属性文件中正确读取了属性。如果我测试验证,如果省略我尝试自动装配的部分,则抛出Null值的预期错误。

3 个答案:

答案 0 :(得分:1)

@Autowired
public static ConfigProperties config;

您无法在Spring中自动加载static字段。

  

//只是为了测试autowire是否正常工作

您可以为此编写新的Junit测试用例。

类似的东西:

@Autowired
public ConfigProperties config;

在你的考试课程中。

答案 1 :(得分:1)

由于注释@Autowired要求getter / setter注入正确的实现,因此我不建议您连接静态内容。但是,此问题有一种解决方法:

public static ConfigProperties config;

@Autowired
public Application(ConfigProperties config) {
    Application.config= config;
}

或者,查看@PostConstruct注释。

答案 2 :(得分:0)

不要使用静态ConfigProperties。然后使用@PostConstruct从配置对象中打印ID。

@Autowired
ConfigProperties config;

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

@PostConstruct 
void printId(){
    System.out.println("ID = " + config.getId());
}