哪一个先加载?静态块还是弹簧豆?

2022-09-02 10:03:54

我正在用 spring 自动连接一个对象,并且我正在使用相同的自动连接对象调用一个方法。它正在抛出NullPointerException。问题是我在静态块内调用该方法。以下是我的代码 -

@Autowired
static MyPropertyManagerClass myPropertyManagerClass;

private static URL SERVICE_URL = null;

static {
    try {

        SERVICE_URL = myPropertyManagerClass.getServiceURL();
    }
    catch (Exception e) {
        log.error("Exception Occurred While Invoking myPropertyManagerClass.getServiceURL() : " , e);
    }
}

如果我没有错的话,这是因为静态块首先被加载。有没有办法在不创建带有new关键字的对象的情况下完成这项工作?


答案 1

静态块在类初始化时调用,在装入类之后。组件的依赖项尚未初始化。这就是为什么你得到一个(你的依赖关系是空的)。NullPointerException

将代码移动到带批注的方法。这将确保在初始化组件的所有依赖项时,代码将运行。@PostConstruct


答案 2

static块将始终在弹簧注射之前进行处理。正如@TheLostMind所建议的那样,“使用@PostConstruct并将代码放在那里”。如果你想避免,你可以在你的Xml文件中使用弹簧。newfactory-method


推荐