2014-03-04 20 views
11

我正在使用Spring 3.1.3作为webapp,使用XML配置和组件扫描。为什么Spring忽略我的@DependsOn注解?

我意识到其中一个扫描的组件必须在其他几个之前初始化。在需要构造后初始化的所有类上,我在方法上有一个@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(); 
     .... 
    } 
} 

要重申,有什么我发现在运行时的“的init()”中的“ClassDependentOnConfigData”方法被调用由春“的init()”方法之前在“ConfigData”。

还要注意“BaseClass”对于“ConfigData”有一个“@Autowired”。

+0

你可以张贴bean定义的configData豆(Java和/或XML),以及后应初始化一个bean它作为一个例子吗? –

+0

好吧,但这些只会是骨架,你会看到我的描述中显而易见的。 –

+0

至于没有看到Spring调试消息。你有没有检查你没有全局THRESHOLD集或换句话说 - 你看到其他的DEBUG消息吗? –

回答

5

(从别人的正确的,但现在删除的答案)

的@DependsOn合同只保证豆已建成和属性已设置。这不能保证任何@PostConstruct方法已被调用。

让这个工作的方法是让“dependee”类(别人依赖的类)实现“InitializingBean”类,它需要实现“afterPropertiesSet()”方法。我将我的“init()”方法的原始体放入此方法中。我证实了这一点现在在任何依赖于此的类之前执行。

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

+0

感谢您再次添加答案,我一直在寻找这个解决方案两天! –

4

我也遇到过同样的问题,但还是没有妥善解决。作为一种解决方案Spring文档的一部分表示:

“在类级使用DependsOn没有影响,除非在使用组件的扫描。“

这就是为什么@DependsOn注解没有效果的原因。