为什么Spring会忽略我的@DependsOn注释?
我将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();
....
}
}
重申一下,我在运行时发现的是,Spring在“ ConfigData”中的“ init()”方法之前调用了“
ClassDependentOnConfigData”中的“ init()”方法。
另请注意,“ BaseClass”的“ ConfigData”具有“ @Autowired”。
回答:
(来自其他人的正确答案,但现在已删除答案)
@DependsOn合同仅保证已构造bean和设置了属性。这不能保证已调用任何@PostConstruct方法。
使此方法起作用的方法是让“ dependee”类(其他人依赖的类)实现“ InitializingBean”类,这需要实现“
afterPropertiesSet()”方法。我将“ init()”方法的原始内容放入此方法中。我验证了这是现在在依赖于此的任何类之前执行的。
原始答案中提到的另一件事是,如果我已经用XML定义了“ dependee” bean并使用了“ init-
method”属性,则该WOULD将在依赖于此的任何类之前执行。我没有验证。
以上是 为什么Spring会忽略我的@DependsOn注释? 的全部内容, 来源链接: utcz.com/qa/430313.html