SpringBoot 中 application.properties 中的 @Value 始终为 null

Posted

技术标签:

【中文标题】SpringBoot 中 application.properties 中的 @Value 始终为 null【英文标题】:@Value from application.properties in SpringBoot gives null all the time 【发布时间】:2019-01-06 19:11:21 【问题描述】:

如何正确地从 application.properties 文件中注入值?

主类:

@SpringBootApplication
public class Main 


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

application.properties 文件:

my.password=admin

测试类:

@Component
public class Test 
    @Value("$my.password")
    private String mypassword;

    public String getMypassword() 
        return mypassword;
    

    public void setMypassword(String mypassword) 
        this.mypassword = mypassword;
    

    public Test()
        System.out.println("@@@@@@@@@@@@@@@@@@@"+ mypassword);
    

控制台打印始终为 null,而不是来自 application 文件的值

【问题讨论】:

我不认为 Value 标记在调用构造函数之前分配了值。我可能是错的,但是在新函数上使用 PostConstruct 标记并打印值,看看是否有效。 你是对的,谢谢你的帮助 【参考方案1】:

在创建类时(即调用构造函数时)不会注入属性,而是稍后注入。因此,您会在构造函数中看到 null。

尝试像这样添加带有@PostConstruct 注释的方法并检查结果:

@PostConstruct
public void afterCreation()
    System.out.println("@@@@@@@@@@@@@@@@@@@"+ mypassword);

【讨论】:

谢谢,你是对的。但我还有另一个问题。它适用于@PostConstruct,但是当我尝试创建 Test t = new Test();并调用 afterCreation() 它再次打印 null 。有没有另一种在springboot中创建对象的方法?因为我也试过 "@"Autowired Test t;然后调用 foobar() 但我得到空指针异常 当你做新的,那么你正在创建一个新的对象。而不是春豆。因此@value 或任何弹簧注释没有任何意义,因此为空。在春季环境中做new 是一种犯罪:) 谢谢,但是我应该如何创建对象呢?我想我可以在我的“@”组件上调用@Autowired。但我只剩下空指针了。 你能发布一个你描述的例子吗?如果您的类是 bean(具有这些注释之一 @component、@service、...),那么自动装配不应为 null,前提是您使用的类 @autowired 也是 bean。 我会尽快将其发布在答案中,但问题可能出在@bean 部分,因为我只是使用“@”Component【参考方案2】:

@pvpkiran 我正在尝试将其添加到我的主要方法中,其余部分保持不变。

@SpringBootApplication
public class Application 
    @Autowired
    static Test  t;
    public static void main(String args[])
        SpringApplication.run(Application.class,args);

        t.foobar();
    

【讨论】:

我意识到我现在可能正在做一些春天的异端邪说,但是有人能这么好心地给我展示一个使用@Autowired 创建对象并在代码中某处调用其方法的示例吗?我在任何地方都找不到它。

以上是关于SpringBoot 中 application.properties 中的 @Value 始终为 null的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot的ApplicationRunner

Springboot如何读取配置文件中的属性

是否可以根据springboot中application.properties中的前缀创建多个bean

Springboot - 从 application.yml 注入取决于方法名称

springBoot中的application.yml配置文件

SpringBoot获得application.properties中数据的几种方式