Spring Boot 应用程序从 main 方法中的属性文件中读取值

Spring Boot application to read a value from properties file in main method

提问人:Cork Kochi 提问时间:1/9/2018 最后编辑:Cork Kochi 更新时间:12/13/2021 访问量:16284

问:

我正在尝试获取属性的值

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获取属性

弹簧 弹簧靴

评论

0赞 Maciej Walkowiak 1/9/2018
为什么在上下文运行之前需要此信息?

答:

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()ConfigurableApplicationContextConfigurableEnvironmentSpringApplication.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
嗨,维沙尔。谢谢你的回答。通常,提供几句话来解释解决方案是很有用的。