当前位置: 首页 > 面试题库 >

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

米俊晤
2023-03-14
问题内容

我将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将在依赖于此的任何类之前执行。我没有验证。



 类似资料:
  • 根据我所读到的内容,这是我执行依赖顺序所需要的全部内容。 然后我构建了所有的东西,设置了我的断点,并启动了应用程序。我希望在任何依赖bean之前到达“configData”bean中的断点。事情不是这样的。第一个断点在一个依赖bean的“init”方法中。 然后我更改了“log4j.xml”,将“debug”设置为“org.springframework”的日志级别,并重新运行测试。断点行为是相同

  • 我的JAVA_HOME指向这个JDK的bin文件夹。我的PATH变量中也有相同的bin文件夹。 我的问题是我做错了什么?应该说开发工具包而不是运行时环境吗?

  • 问题内容: 我正在尝试在包级别使用Hibernate @TypeDef批注,这与Hibernate文档中所描述的完全相同。我正在使用和。代码可以编译,并且在类路径中,但是Hibernate仍然看不到它。 如果我上课,那是行得通的,但是如果我把放在那,那是没有用的。我试图用Google搜索,但找不到任何有用的信息。 谢谢! 问题答案: 您可能需要添加一个 到您的Hibernate配置文件,或调用co

  • 问题内容: 这是从CruiseControl执行时得到的: 同时,从命令行启动它可以提供正确的结果。为什么要进入这个?为什么忽略了我?我该如何解决? 我不知道从CC启动when 的值是什么。我真的很想获得这些信息,但我不知道如何。CC本身是从用户开始与该用户给我(这是CentOS的5.4): 问题答案: 假设您有一台linux机器。 看一下,这是一个符号链接。查看此符号链接的目标位置(在我的情况下

  • 问题内容: 我有一个带有关系的实体,我想通过一个查询来检索它,因此使用。有时,Hibernate不尊重它,而是发出N + 1 秒。随着 有时 我的意思是,因为我不知道是什么触发它,我有案件对不同的查询,这可能发生,或者不一样的类。 这是带有我使用的注释的简化实体: 用 我希望单个查询能够同时获取其及其内容,例如 相反,我得到了第一选择所有N S和那么N 献给所有S(考虑没有缓存)。 我发现了许多类

  • 见下图。我的.gitignore文件应该忽略src/dist中的所有文件,但事实并非如此。