繁体   English   中英

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

[英]Why did Spring ignore my @DependsOn annotation?

我使用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”。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM