在执行其他Java类的静态块之前,是否加载并初始化了Spingbean?
在我们的一个遗留代码库中,我发现下面的模式似乎有点脆弱。考虑下面的Spring Bean:在执行其他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
@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
中的静态块在SpringBeanPropsProvider
初始化之前执行,导致UrlUtil.getImageUrl()
将null返回给某个调用方类?如果未首先初始化PropsProvider
,UrlUtil将无法初始化,因为getProperty()
将抛出NPE。如果你问我,真正的味道是你正在使用构造函数初始化一个静态字段。@shmosel感谢你指出会有一个NPE,UrlUtil将无法初始化。这种依赖关系是由Java的类加载器解决的,Java的类加载器可以看到静态块依赖于其他类,还是在Spring生命周期中处理静态块,SpringBean优先于普通Java类?两者都不是。这只是时间安排的问题。类通常在第一次使用时初始化。只要在初始化PropsProvider
之前没有引用UrlUtil
,就可以了。根据您的环境,顺序可能定义良好,也可能只是偶然发生的。我认为这证实了OP的担忧:是的,它看起来相当脆弱。至少,作为一个对春天以及它如何自我初始化的非专家,它把我吓坏了。