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类(使用应用程序属性)设置的静态字段。。这让事情变得复杂。还有其他方法吗?非常感谢。