为什么Spring忽略了我的@DependsOn注释?

2022-09-01 23:24:02

我将Spring 3.1.3用于Web应用程序,使用XML配置和组件扫描。

我意识到其中一个扫描的组件必须在其他几个组件之前初始化。在所有需要后期构造初始化的类上,我都有一个@PostConstruct方法的注释。

为了设置依赖顺序,我将“@Component”更改为“@Component(”configData“)”,该类需要在其他类之前进行后期构造。然后,我在“configData”bean之后需要后构造的每个类定义之前添加了'@DependsOn(“configData”)”。

根据我所读到的内容,这就是我强制执行依赖顺序所需的全部内容。

然后,我构建了所有内容,设置了断点,并启动了应用。我希望在任何依赖的bean之前到达“configData”bean中的断点。事实并非如此。第一个断点是在其中一个依赖 bean 的“init”方法中。

然后,我更改了“log4j.xml”,将“debug”设置为“org.springframework”的日志记录级别,并重新运行我的测试。断点行为是相同的,我的日志记录没有显示任何有关Spring初始化的调试信息(我已经对log4j初始化本身进行了调试,所以我确认我为“org.springframework”设置了DEBUG)。

我可能错过了什么?

更新:

如果这很重要,这里有一些我在这里做的事情的骨架例子。

@Component("configData")
public class ConfigData {
    ....
    @PostConstruct
    public void init() {
        ....
    }
}

@Component
@DependsOn("configData")
public class ClassDependentOnConfigData extends BaseClass {
    ....
    @Override
    @PostConstruct
    public void init() {
        super.init();
        ....
    }
}

重申一下,我在运行时发现的是,“ClassDependentOnConfigData”中的“init()”方法被Spring在“ConfigData”中的“init()”方法之前调用。

另请注意,“BaseClass”有一个“ConfigData”的“@Autowired”。


答案 1

(来自其他人的正确但现在已删除的答案)

@DependsOn合同仅保证豆子已经构建并且属性已经设置。这并不能保证调用了任何@PostConstruct方法。

让它工作的方法是让“dependee”类(其他人依赖的类)实现“初始化Bean”类,这需要实现“afterPropertiesSet()”方法。我将“init()”方法的原始主体放入此方法中。我验证了现在在依赖于此的任何类之前执行。

原始答案中提到的另一件事是,如果我在XML中定义了我的“dependee”bean并使用“init-method”属性,这将在任何依赖于此的类之前执行。我没有验证这一点。


答案 2

我也提出了同样的问题,但仍然没有得到妥善解决。作为解决方案的一部分,Spring文档说:

“除非使用组件扫描,否则在类级别使用 DependsOn 没有任何效果。

这就是@dependsOn注解不起作用的原因。


推荐