Java 属性文件中的Spring和Constants类
我想创建带有公共静态最终字段的Constants类,这些字段是从属性文件中获取的。 问题是ClassLoader总是为null,我无法获取属性文件InputStream 我使用的是SpringJava配置,我知道@PropertySource和@Value Spring注释,但我认为旧式常量类在代码中更具可读性Java 属性文件中的Spring和Constants类,java,spring,Java,Spring,我想创建带有公共静态最终字段的Constants类,这些字段是从属性文件中获取的。 问题是ClassLoader总是为null,我无法获取属性文件InputStream 我使用的是SpringJava配置,我知道@PropertySource和@Value Spring注释,但我认为旧式常量类在代码中更具可读性 @Autowired Constants constants;//in every class that needs constant //... constants.getArticl
@Autowired
Constants constants;//in every class that needs constant
//...
constants.getArticleLimit()
vs简单
Constants.ARTICLES_LIMIT //static var version
这是我的代码:
package org.simpletest.utils
import org.apache.log4j.Logger;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Constants {
private static final Logger LOG = Logger.getLogger(Constants.class);
public static final int ARTICLES_LIMIT;
public static final String PROPERTIES_LOCATION = "constants.properties";
static {
Properties p = new Properties();
//default values
int articlesLimit = 10;
Class<?> clazz = Constants.class.getClass();
ClassLoader cl = clazz.getClassLoader();
//try to load from properties file
try(final InputStream is = cl.getResourceAsStream(PROPERTIES_LOCATION)){
p.load(is);
articlesLimit= Integer.parseInt(p.getProperty("articleslimit"));
} catch (IOException e) {
LOG.debug(String.format("Unable to load {0} properties file. Getting constants by default values.",PROPERTIES_LOCATION),e);
}
ARTICLES_LIMIT = articlesLimit;
}
}
package org.simpletest.utils
导入org.apache.log4j.Logger;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.Properties;
公共类常量{
私有静态最终记录器LOG=Logger.getLogger(Constants.class);
公共静态最终整数限制;
公共静态最终字符串属性\u LOCATION=“constants.PROPERTIES”;
静止的{
属性p=新属性();
//默认值
int=10;
Class clazz=Constants.Class.getClass();
ClassLoader cl=clazz.getClassLoader();
//尝试从属性文件加载
try(最终输入流为=cl.getResourceAsStream(属性\位置)){
p、 负载(is);
articlesLimit=Integer.parseInt(p.getProperty(“articlesLimit”);
}捕获(IOE异常){
LOG.debug(String.format(“无法加载{0}属性文件。按默认值获取常量。”,属性\位置),e);
}
条款限制=条款限制;
}
}
经过一点测试后,这就是问题所在:
System.out.println(Constants.class.getClass());
这将打印类加载器可能尚未加载的java.lang.Class
。这是因为SomeClass.class
的类是java.lang.class
删除getClass()
,类加载器将不会为空。不需要clazz
变量。这就是您需要做的全部工作:
ClassLoader cl = Constants.class.getClassLoader();
为什么不使用@Environment来读取属性文件?如果在上下文中使用PropertyPlaceholder,则可以直接在Springbean中使用属性值。请参阅@MichaelPeacock,如果我正确理解,这将迫使我在使用它们的每个类中添加所有常量。似乎在静态块之后才设置类加载器?但是我不能复制这个。什么版本的JVM?谢谢,这很有帮助。