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

Dav*_*arr 15 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();
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

重申一下,我在运行时发现的是"ClassDependentOnConfigData"中的"init()"方法是由Spring在"ConfigData"中的"init()"方法之前调用的.

另请注意,"BaseClass"对于"ConfigData"具有"@Autowired".

Dav*_*arr 12

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

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

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

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

  • 感谢您再次添加答案,我已经寻找这个解决方案两天了! (2认同)

小智 5

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

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

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