我正在使用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”);
它给出了同样的错误。
不允许访问静态成员函数中的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")
}
}
Spring不允许将值注入静态变量。
解决方法是创建一个非静态setter,将值分配给静态变量:
@Service
public class UserService {
private static String SVN_URL;
@Value("${SVN_URL}")
public void setSvnUrl(String svnUrl) {
SVN_URL = svnUrl;
}
}
想一想你的问题。您不必保留<code>应用程序的任何属性。静态字段中的属性。Patrick建议的“解决方法”非常肮脏:
请记住,当您通过注释控制 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;
}
}
这种方法更好,原因如下:
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设计模式的非常简单的方法: