Java 如何仅在对象';设置了哪些属性?
我有一个名为Java 如何仅在对象';设置了哪些属性?,java,spring,spring-mvc,java-7,Java,Spring,Spring Mvc,Java 7,我有一个名为ApplicationProperties的对象。该对象具有私有字段和公共getter方法。非常琐碎 if (properties == null) { properties = new ApplicationProperties(); SettingsLoader settingsLoader = new SettingsLoader(properties); settingsLoader.loadApplicationSet
ApplicationProperties
的对象。该对象具有私有字段和公共getter方法。非常琐碎
if (properties == null) {
properties = new ApplicationProperties();
SettingsLoader settingsLoader = new SettingsLoader(properties);
settingsLoader.loadApplicationSettings();
}
return properties;
我也有SpringBean,其中一些依赖于ApplicationProperties
来读取一些路径等。这在很长一段时间内运行良好。JDK是OracleJDK1.6
。但最近我在openjdk1.7icedtea中部署时
我得到了一些NullPointerException
,因为Springbean使用的应用程序属性有空字段(未完全初始化)
可能是并行类加载是在开放JDK的情况下完成的(不确定)
如何确保只有在
ApplicationProperties
完全就绪后,才能实例化所有SpringBean(数量超过200个,并且许多是通过注释实现的)?将properties对象作为构造函数依赖项注入所有需要它的Bean 类ApplicationProperties
是一个不受Spring IoC控制的非bean。由于某些原因,该代码在oraclejdk1.6
及更高版本上运行良好,但在openjdk1.7icedtea
上不起作用,我得到了一些NullPointerException
作为参考,我将此解决方案作为答案发布
由于在创建bean之前需要完全加载非bean类属性,所以我将加载部分委托给了一个单独的线程,这对我来说很好
public class SettingsLoader implements Runnable {
//Other methods go here
@Override
public void run() {
loadApplicationSettings();
}
}
以及应用程序属性的构造函数内部
private ApplicationProperties() {
SettingsLoader settingsLoader = new SettingsLoader(this);
Thread loader = new Thread(settingsLoader);
loader.setName("Settings Loader");
logger.info("Settings Loader is initiated. Loading application settings.");
loader.setPriority(Thread.MAX_PRIORITY);
try {
loader.start();
loader.join();
} catch (InterruptedException ex) {
logger.error("Application settings loader is interrupted. Exception is", ex);
}
}
有了它,当前线程将等待线程加载程序完成其设置应用程序属性字段的工作。实际上,一些bean具有使用一些非bean类(使用应用程序属性)设置的静态字段。。这让事情变得复杂。还有其他方法吗?非常感谢。