提问人:Cork Kochi 提问时间:1/9/2018 最后编辑:Cork Kochi 更新时间:12/13/2021 访问量:16284
Spring Boot 应用程序从 main 方法中的属性文件中读取值
Spring Boot application to read a value from properties file in main method
问:
我正在尝试获取属性的值
hello.world=Hello World
在 MainApp 类中
@SpringBootApplication
public class MainApp {
public static void main(String[] args) {
SpringApplication.run(MainApp.class, args);
}
这不起作用,因为它是主要方法。
@Value("${hello.world}")
public static String helloWorld;
也许它可以加载
Properties prop = new Properties();
// load a properties file
prop.load(new FileInputStream(filePath));
在SpringApplication.run之前,有没有其他更好的方法可以在SpringBoot的main方法中使用Spring获取属性
答:
9赞
sanit
1/9/2018
#1
ConfigurableApplicationContext ctx =
SpringApplication.run(MainApp.class, args);
String str = ctx.getEnvironment().getProperty("some.prop");
System.out.println("=>>>> " + str);
评论
0赞
Cork Kochi
1/9/2018
在此之后,我们必须再次调用 app.run(args) 来启动应用程序?
0赞
sanit
1/9/2018
我们通常调用方法来启动 Spring Boot 应用程序。 返回,而 return 又可以返回 包含方法以提取属性。为了验证是否看到您的对帐单,它还将返回 .run()
run()
ConfigurableApplicationContext
ConfigurableEnvironment
SpringApplication.run(MainApp.class, args)
ConfigurableApplicationContext
0赞
Cork Kochi
1/9/2018
如果我们必须在SpringApplication.run之前获得怎么办?
2赞
sanit
1/9/2018
当我们调用时,它会启动自动接线、依赖等任务。在此之前,在spring的帮助下,我们无法获取任何属性,为此,您必须手动读取属性文件。您能否在调用方法之前指定要读取属性的用例是什么?SpringApplication.run()
run()
0赞
sanit
1/9/2018
那么我相信您必须按照前面提到的手动过程加载属性文件并读取它。
3赞
pvpkiran
1/9/2018
#2
您已将变量 helloWorld 声明为 static。因此,您需要使用 Setter Injection 而不是 Field Injection。
注入静态非最终字段是一种不好的做法。因此,Spring 不允许这样做。但是你可以做一个这样的解决方法。
public static String helloWorld;
@Value("${hello.world}")
public void setHelloWorld(String someStr) {
helloWorld = someStr
}
您可以在类中的任何位置访问此变量 helloWorld(如果它是任何其他类)。但是如果你想在主类中做。您只能在此行之后访问该变量
SpringApplication.run(MainApp.class, args);)
即仅在应用程序启动后。
评论
2赞
pvpkiran
1/9/2018
当然有效。唯一的问题是我们只能在SpringApplication.run(....)
0赞
Amaravathi
1/10/2018
#3
我们不能将值读入静态字段。以下是解释,可以更好地了解如何将 application.properties 中的值分配给静态变量?
1赞
Cork Kochi
1/10/2018
#4
@SpringBootApplication
public class MainApp {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(MainApp.class);
springApplication.addListeners(new VersionLogger());
springApplication.run(args);
}
// The VersionLogger Class
public class VersionLogger implements ApplicationListener<ApplicationEnvironmentPreparedEvent>{
@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent applicationEvent) {
String helloWorld = applicationEvent.getEnvironment().getProperty("hello.world");
}
}
ApplicationEnvironmentPreparedEvent当 SpringApplication 启动并且环境首次可用于检查和修改时发布的事件。
2赞
Tomasz S
10/28/2019
#5
别这样。最好使用 CommandLineRunner。 多亏了这一点,您可以拥有 Spring Boot 自动为您运行的非静态方法:
@SpringBootApplication
public class SimulatorApplication implements CommandLineRunner {
@Value("${my-value}")
private myValue;
public static void main(String[] args) {
SpringApplication.run(SimulatorApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
// here you can access my-value
}
}
评论
1赞
Net Dawg
10/5/2021
要让 Spring Boot 从 application.properties 获取属性 my-value,请使用 @Value(${my-value}) myValue Not,正如您拥有的那样 @Value(“myvalue”) myValue,这意味着 String myValue = “my-value”;
0赞
Tomasz S
12/13/2021
谢谢@NetDawg,在上面的回答中修复。
1赞
Vishal Bhama
10/16/2020
#6
ApplicationContext applicationContext = SpringApplication.run(Application.class, args);
String applicationPropertyVersion=applicationContext.getEnvironment().getProperty("application.property.version");
LOGGER.info("RELEASE CODE VERSION {} and applicationProperty Version {} ", LcoBuildVersion.version,
applicationPropertyVersion);
评论
1赞
MaxV
10/17/2020
嗨,维沙尔。谢谢你的回答。通常,提供几句话来解释解决方案是很有用的。
评论