我正在使用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”。
答案 0 :(得分:10)
(来自其他人的正确但现已删除的答案)
@DependsOn合约仅保证已构造bean并已设置属性。这并不能保证调用任何@PostConstruct方法。
让它工作的方法是让“dependee”类(其他人依赖的类)实现“InitializingBean”类,这需要实现“afterPropertiesSet()”方法。我将我的“init()”方法的原始主体放入此方法中。我确认现在在依赖于此的任何类之前执行此操作。
原始答案中提到的另一件事是,如果我在XML中定义了我的“dependee”bean并使用了“init-method”属性,那么这个WOULD就会在任何依赖于它的类之前执行。我没有证实这一点。
答案 1 :(得分:5)
我也遇到了同样的问题,但仍未妥善解决。作为解决方案的一部分,Spring文档说:
"除非正在使用组件扫描,否则在类级别使用DependsOn无效。"
这就是@dependsOn注释无效的原因。