Spring Boot外部属性未加载

时间:2018-01-16 09:58:36

标签: java spring-boot

我从Spring Boot开始,所以我首先浏览Spring Boot reference Guide

我目前正在查看Externalized Configuration

我的目标是让一个简单的组件读取application.properties的值,如果我没有记错的话,应该自动加载,无需进一步配置。

参考中的例子如下:

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

@Component
public class MyBean {

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

    // ...

}

以下解释:

  

在您的应用程序类路径上(例如在您的jar中),您可以拥有一个   application.properties,提供合理的默认属性值   为了名字。在新环境中运行时,是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中)

  

名= MYNAME

所以,如果我遵循引用中的逻辑(这篇文章中也提到了Read application.properties,并运行我的应用程序。

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

如参考所述,在24.2中:

  

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

所以,为了检查,我运行带有密钥的application.properties的.jar文件,并添加--name=passedName作为命令行参数。

即使这个值应该自动添加到环境中,并且否决当前存在的任何东西(或者在我的情况下:什么都没有),并且我希望getName()返回“ReadName_passedName”,它仍然返回“ReadName_null”

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

我有什么明显的遗失吗?

1 个答案:

答案 0 :(得分:3)

如果您执行new Admin (),则表示您正在创建一个新的Admin实例,而不是一个spring bean。因此,您不会获得spring提供的任何优势(例如依赖注入),因此该值为null。

相反,你应该在课堂上自动装配它。这样spring将注入它创建的Admin实例(带注入值)

@Autowired
Admin admin;  

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

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

相关问题