【问题标题】:JAVA Spring Boot : How to access application.properties values in normal classJAVA Spring Boot:如何访问普通类中的 application.properties 值
【发布时间】:2021-07-10 09:22:25
【问题描述】:

我知道如何在 Java Spring boot 中访问 @Service 类中的 application.properties 值,如下所示

@Service
public class AmazonClient {

    @Value("${cloud.aws.endpointUrl}")
    private String endpointUrl;
}

但我正在寻找一个选项来直接在任何类中访问此值(没有@Service 注释的类)

例如

public class AppUtils {
      @Value("${cloud.aws.endpointUrl}")
      private String endpointUrl;
}

但这会返回null。任何帮助,将不胜感激。 我已经阅读了here,但没有帮助。

【问题讨论】:

  • 也许是@Autowired private Environment env;?我知道这不一样,但是...
  • @Berto99 已经尝试过但没有用!
  • 你试过在类上注解@Component吗?
  • @SudiptaRoy 你能给我看一个示例代码吗?

标签: java spring-boot class


【解决方案1】:

没有“神奇”的方法可以将属性文件中的值注入到非 bean 的类中。您可以在类中定义一个静态的java.util.Properties 字段,在类加载时手动从文件中加载值,然后使用该字段:

public final class AppUtils {
    private static final Properties properties;

    static {
        properties = new Properties();

        try {
            ClassLoader classLoader = AppUtils.class.getClassLoader();
            InputStream applicationPropertiesStream = classLoader.getResourceAsStream("application.properties");
            applicationProperties.load(applicationPropertiesStream);
        } catch (Exception e) {
            // process the exception
        }
    }
}

【讨论】:

  • 这行得通。但是每次从 AppUtils 类调用任何函数时,我都会像这样访问 properties.getProperty("cloud.aws.endpointUrl") ,我希望这不会导致内存泄漏
  • @KishanSolanki 一个后续问题,您将如何在代码中创建AppUtils 对象?
  • 1.此代码不会导致内存泄漏。我们从文件中加载属性的static 块仅在JVM 加载此类时运行一次。因此,如果您启动应用程序并使用此类,则不应再次加载最后一个。
  • 2.我们可以添加静态方法来从这个property字段中获取属性,然后在代码中调用这个方法:var propertyValue = AppUtils.getSomePropertyValue()
【解决方案2】:

您可以通过使用@component 注释来注释您的应用程序实用程序类来轻松实现这一点。 spring 将负责加载属性。

但如果您不想采用这种方法,请查看下面的链接。

https://www.baeldung.com/inject-properties-value-non-spring-class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2020-03-18
    • 2020-12-25
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多