繁体   English   中英

Spring Boot外部属性未加载

[英]Spring Boot external properties not loaded

我从Spring Boot开始,所以我首先要阅读Spring Boot参考指南

我目前正在查看外部化配置

我的目标是要有一个简单的Component来从application.properties读取值,如果我没有记错的话,应该自动加载它,而无需进行任何进一步配置。

参考中的示例如下:

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

有以下说明:

在您的应用程序类路径上(例如,在jar内),您可以具有application.properties,它为名称提供了合理的默认属性值。 在新环境中运行时,可以在jar外部提供application.properties,以覆盖名称; 对于一次性测试,您可以使用特定的命令行开关启动(例如java -jar app.jar --name =“ Spring”)。

似乎很简单。 因此,我创建了以下组件:

@Component
public class Admin {

    @Value("${name}")
    private String name;

    public String getName(){
        return "ReadName_" + name;
    }
}

并且,在我的recources文件夹中,以下application.properties文件(我已验证将其复制到我的.jar中)

名字=我的名字

因此,如果我遵循参考中的逻辑(本文中也提到了该逻辑,请阅读application.properties并运行我的应用程序。

该代码可以编译并运行,没有错误,但是每次我从屏幕上的Admin实例打印getName()的值时,它只会给出一个“ ReadName_null”而不是属性文件中的值“ ReadName_myName”。

作为参考,在24.2中:

默认情况下,SpringApplication会将所有命令行选项参数(以'-'开头,例如--server.port = 9000)转换为属性,并将其添加到Spring Environment中。 如上所述,命令行属性始终优先于其他属性源。

因此,仅检查一下,我同时运行了带有既有密钥的application.properties和我的.jar文件,并将--name=passedName添加为命令行参数。

即使此值应自动添加到环境中,并且否决当前存在的任何内容(或者在我的情况下为:无),并且我希望getName()返回“ ReadName_passedName”,但它仍将返回“ ReadName_null”。

编辑:我打印引导时传递的命令行参数,所以我知道该参数确实被系统读取为“ --name = passedName”

有什么明显的我想念的地方吗?

如果执行new Admin () ,则将创建Admin的新实例,而不是spring bean。 因此您没有得到spring提供的任何优势(例如Dependency Injection),因此该值为null。

相反,您应该在课堂上对其进行自动布线。 这样,spring将注入它创建的Admin实例(具有注入的值)

@Autowired
Admin admin;  

在您询问之前,默认情况下,是的,所有bean都是单例(除非另有说明)。 因此,无论您在何处使用Autowire Admin,您都将获得相同的实例。

这是一个广泛的主题,您应该阅读它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM