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

时间:2014-03-04 17:23:45

标签: java spring

我正在使用Spring 3.1.3进行webapp,使用XML配置和组件扫描。

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

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

根据我的阅读,这就是我需要强制执行依赖顺序。

然后我构建了所有内容,设置了断点,并启动了应用程序。我希望在任何依赖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”。

2 个答案:

答案 0 :(得分:10)

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

@DependsOn合约仅保证已构造bean并已设置属性。这并不能保证调用任何@PostConstruct方法。

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

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

答案 1 :(得分:5)

我也遇到了同样的问题,但仍未妥善解决。作为解决方案的一部分,Spring文档说:

  

"除非正在使用组件扫描,否则在类级别使用DependsOn无效。"

这就是@dependsOn注释无效的原因。