Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在执行其他Java类的静态块之前,是否加载并初始化了Spingbean?_Java_Spring_Static_Classloader_Static Block - Fatal编程技术网

在执行其他Java类的静态块之前,是否加载并初始化了Spingbean?

在执行其他Java类的静态块之前,是否加载并初始化了Spingbean?,java,spring,static,classloader,static-block,Java,Spring,Static,Classloader,Static Block,在我们的一个遗留代码库中,我发现下面的模式似乎有点脆弱。考虑下面的Spring Bean: @Component public class PropsProvider { private static Properties props; @Inject PropsProvider(Configuration config) { PropsProvider.props = ConfigurationConverter.getProperties

在我们的一个遗留代码库中,我发现下面的模式似乎有点脆弱。考虑下面的Spring Bean:

 @Component
 public class PropsProvider {
     private static Properties props;

     @Inject
     PropsProvider(Configuration config) {
         PropsProvider.props = ConfigurationConverter.getProperties(config);
     }

     public static String getProperty(String key) {
         return props.getProperty(key);
     }
}
然后将以静态方式在普通Java类中引用,如下所示:

public class UrlUtil {
    private static String IMAGE_URL;

    static {
        IMAGE_URL = PropsProvider.getProperty("image_url");
    }

    private UrlUtil() {}

    public static void String getImageUrl() {
        return IMAGE_URL;
    }
}

是否存在这样一个实例:在服务器启动期间,
UrlUtil
中的静态块在SpringBean
PropsProvider
初始化之前执行,导致
UrlUtil.getImageUrl()
将null返回给某个调用方类?

如果未首先初始化
PropsProvider
,UrlUtil将无法初始化,因为
getProperty()
将抛出NPE。如果你问我,真正的味道是你正在使用构造函数初始化一个静态字段。@shmosel感谢你指出会有一个NPE,UrlUtil将无法初始化。这种依赖关系是由Java的类加载器解决的,Java的类加载器可以看到静态块依赖于其他类,还是在Spring生命周期中处理静态块,SpringBean优先于普通Java类?两者都不是。这只是时间安排的问题。类通常在第一次使用时初始化。只要在初始化
PropsProvider
之前没有引用
UrlUtil
,就可以了。根据您的环境,顺序可能定义良好,也可能只是偶然发生的。我认为这证实了OP的担忧:是的,它看起来相当脆弱。至少,作为一个对春天以及它如何自我初始化的非专家,它把我吓坏了。