【问题标题】:How do I use my exctracted properties from @PropertySource如何使用从@PropertySource 提取的属性
【发布时间】:2019-07-11 23:09:12
【问题描述】:

我正在尝试使用 @PropertySource 来从 .properties 文件加载属性并在我的 Spring-batch 中使用它们。

我有一个 Config.java 文件,它假设加载这些属性,一个包含数据的 application.properties 文件,我试图通过另一个文件中的 Config.java 实例访问这些数据。但是看起来 Config 对象是空的。

这是 Config.java 文件:

package demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource("classpath:config/application.properties")
public class Config {

    @Autowired Environment env;

    //Attempt number 1
    @Value("${source.name}")
    public String name;

    //Attempt number 2
    public String getSource(){
        return env.getProperty("source.name"); 
    }

}

application.properties 文件:

source.name="OPTIQ"

还有我试图到达这一特定行的另一个文件(我已经删除了很多过程,但只有这些行很重要):

public class Process{

   @Autowired Config configuration;
   String source;

   public setSource(){
       this.source = configuration.source;
       // this.source = configuration.getSource();
   }

}

结果将是“OPTIQ”,但配置对象似乎为空或未初始化,所以我想我在这里遗漏了一步,或者我不完全了解 @PropertySource 的工作原理.

我没有文件访问错误,他似乎找到了文件。

第一个问题是,哪种尝试是正确的:
- 数字 1 与 @Value ?
- 带有公共 getSource() 的 2 号?
第二个问题: 我需要改变什么才能做到这一点?

【问题讨论】:

  • 如果 Config 为空,可能您在 Process 类中的 Config 字段上缺少 @Autowired 注释?
  • @Spasoje 即使这样,对象仍然是空的......
  • 感兴趣如果不是@Autowired,你如何初始化configuration?你的 Process 类是如何初始化的?如果您这样做 new Process(..),Autowire 将不起作用
  • 你说得对@pirho,我在其他地方做new Process()。我对注释和弹簧不太满意。您认为实现我在这里尝试的最佳方式是什么?

标签: java spring spring-boot spring-batch


【解决方案1】:

在您的班级中自动连接org.springframework.core.env.Environment。然后您将能够使用environment.getProperty(propertyName) 访问属性;

@Component
public class Process{
   @Autowired
   private Environment environment;
   public void yourMethod(){
  // access it as below wherever required.
   environment.getProperty(propertyName);
 }
}

还在 Config 类上添加 @PropertySource

@Configuration
@PropertySource("classpath:some.properties")
public class Config {

}

【讨论】:

  • environment 在我这样做时似乎是空的。但我不明白,如果我们在我的 Process 类中使用 Autowire Environment,那么 Config 类有什么用?只是通知属性的来源吗?
  • 您可以在其中定义一些自定义 bean 定义。通常,组件扫描确实会为您创建 bean。但是,如果您想要任何具有您明确设置的设置的 bean,那么您可以在 @config 注释类中指定这些设置。参考:docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
  • 我明白了,你认为我的Environment 问题是由于我的Processclass 的初始化引起的吗?还是应该可以从任何地方访问environment
  • 您的 Process 类只能通过 spring 创建。如果您通过显式调用构造函数来创建任何对象,那么它将不会具有所有依赖项,例如 Environment 和 spring 的任何其他特性。您的 Process 类应该使用 @Component 注释进行注释,以便 spring 为您创建一个对象。
  • 这应该在你的 Process Bean 中注入 Environment 并且它不会为空
猜你喜欢
  • 2023-03-12
  • 2014-07-21
  • 2016-09-02
  • 2020-03-03
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多