我从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”
我有什么明显的遗失吗?
答案 0 :(得分:3)
如果您执行new Admin ()
,则表示您正在创建一个新的Admin实例,而不是一个spring bean。因此,您不会获得spring提供的任何优势(例如依赖注入),因此该值为null。
相反,你应该在课堂上自动装配它。这样spring将注入它创建的Admin实例(带注入值)
@Autowired
Admin admin;
在您提出之前,默认情况下,所有bean都是单例(除非另有说明)。因此,无论您使用Autowire Admin,您都将获得相同的实例。
这是一个广泛的主题,您应该阅读它。