当前位置: 首页 > 知识库问答 >
问题:

如何从应用程序分配值。属性转换为静态变量?

弘志勇
2023-03-14

我正在使用Spring MVC。我有一个用@Service注释的UserService类,它有很多静态变量。我想用application.properties文件中的值实例化它们。

例如在application.properties我有:SVN_URL=http://some.url/repositories

那么在类中有:@Value(“${SVN_URL}”) 私有静态字符串SVN_URL

我获取bean的< code >实例化失败;嵌套异常是Java . lang . exceptioniniinitializererror

我也尝试过@了的私有静态环境环境;

然后:私有静态字符串 SVN_URL=env.getProperty(“SVN_URL”);

它给出了同样的错误。

共有3个答案

欧阳博超
2023-03-14

不允许访问静态成员函数中的application.properties,但这里有一个解决方法,

server.ip = 127.0.0.1
public class PropertiesExtractor {
     private static Properties properties;
     static {
        properties = new Properties();
        URL url = new PropertiesExtractor().getClass().getClassLoader().getResource("application.properties");
        try{
            properties.load(new FileInputStream(url.getPath()));
           } catch (FileNotFoundException e) {
                e.printStackTrace();
           }
        }

        public static String getProperty(String key){
            return properties.getProperty(key);
        }
}
public class Main {
    private static PropertiesExtractor propertiesExtractor;
    static{
         try {
             propertiesExtractor = new PropertiesExtractor();
         } catch (UnknownHostException e) {
               e.printStackTrace();
           }
    }

    public static getServerIP(){
        System.out.println(propertiesExtractor.getProperty("server.ip")
    }
}
娄利
2023-03-14

Spring不允许将值注入静态变量。

解决方法是创建一个非静态setter,将值分配给静态变量:

@Service
public class UserService {

    private static String SVN_URL;

    @Value("${SVN_URL}")
    public void setSvnUrl(String svnUrl) {
        SVN_URL = svnUrl;
    }

}
张丁雷
2023-03-14

想一想你的问题。您不必保留<code>应用程序的任何属性。静态字段中的属性。Patrick建议的“解决方法”非常肮脏:

    < li >您不知道这个静态字段何时被修改 < li >您不知道哪个线程修改了它的值 < li >任何线程在任何时候都可以改变这个静态字段的值,这样你就完蛋了 < li >以这种方式初始化私有静态字段对我来说没有意义

请记住,当您通过注释控制 bean 时@Service您可以将其创建委托给 Spring 容器。Spring 通过只创建一个在整个应用程序中共享的 Bean 来控制这个 Bean 生命周期(当然你可以改变这个行为,但我在这里指的是一个默认的)。在这种情况下,任何静态字段都没有意义 - Spring 确保只有一个 UserService 实例。你得到你描述的错误,因为静态字段初始化发生在 Spring 容器启动之前的许多处理器周期。在这里,您可以找到有关何时初始化静态字段的更多信息。

做这样的事情会好得多:

@Service
public class UserService {
    private final String svnUrl;

    @Autowired
    public UserService(@Value("${SVN_URL}") String svnUrl) {
        this.svnUrl = svnUrl;
    }
}

这种方法更好,原因如下:

    < li >构造函数注入直接描述初始化对象所需的值 < li> final字段表示该值在构造函数调用中初始化后不会被更改(您是线程安全的)

还有另一种方法可以将多个属性加载到一个类中。它要求对要加载到配置类中的所有值使用前缀。考虑下面的例子:

@ConfigurationProperties(prefix = "test")
public class TestProperties {

    private String svnUrl;

    private int somePort;

    // ... getters and setters
}

Spring将处理Test属性类初始化(它将创建一个test属性bean),您可以将此对象注入到由Spring容器初始化的任何其他bean中。以下是示例application.properties文件的样子:

test.svnUrl=https://svn.localhost.com/repo/
test.somePort=8080

Baeldung在他的博客上写了一篇关于这个主题的很棒的文章,我推荐阅读它以获得更多信息。

如果您需要以某种方式在静态上下文中使用值,最好定义一些带有公共静态最终字段的公共类 - 这些值将在类加载器加载此类时实例化,并且在应用程序生命周期内不会修改它们。唯一的问题是你将无法从 Spring 的 application.properties 文件中加载这些值,你必须直接在代码中维护它们(或者你可以实现一些从属性文件加载这些常量值的类,但这听起来很冗长你试图解决的问题)。

 类似资料:
  • 在我的申请中。在yaml属性文件中,我定义了一个变量,如下所示- 从这篇SOF文章中,我了解了。(点)和-(破折号)是如何转换的。 现在在ENV变量文件中-我没有像- 或或等 相反,我在env(文件)是- spring boot是否将props文件中的变量< code > service-account . SECRET 与< code > service account _ SECRET env

  • 问题内容: 我正在使用Spring MVC。我有一个带有很多静态变量的注释类。我想使用application.properties文件中的值实例化它们。 例如在中,我有: 然后在课堂上是: 我得到了 我也尝试过 接着: 它给出了相同的错误。 问题答案: 你不必在静态字段中保留任何属性。 你不知道何时修改此静态字段 你不知道哪个线程修改了它的价值 任何时候任何线程都可以更改此静态字段的值,并且你被拧

  • 概述: 我在我的logback.xml文件中使用哨兵appender,我想通过大量的标签作为参数从application.properties文件到logback配置文件。 向后退。xml文件: application.properties: 注意:application.properties中的spring.profiles.active属性映射到logback配置文件中的springProfi

  • 在Spring靴中, application.yml: 通过使用上述配置,我们可以避免在spring boot中基于java web(bean)的配置,这是一个很有价值的优势。 Q: 我们可以从应用程序中添加Kafka错误处理程序和Kafka消费者重试次数属性吗。属性/应用。yml? 我找不到任何关于它的参考或留档,因此希望有一些结论,只是因为这个问题,现在我必须在Spring Boot中转到并删

  • 我有一个JSON格式。 我希望将其转换为以下格式的对象:

  • 本文向大家介绍PHP 静态属性和变量,包括了PHP 静态属性和变量的使用技巧和注意事项,需要的朋友参考一下 示例 用public可见性定义的静态类属性在功能上与全局变量相同。可以从定义类的任何位置访问它们。 函数也可以在自己的范围内定义静态变量。这些静态变量通过多个函数调用持久化,这与在函数范围内定义的常规变量不同。这是实现Singleton设计模式的非常简单的方法: