【问题标题】:Spring XML Initialization OrderSpring XML 初始化顺序
【发布时间】:2012-06-18 22:45:40
【问题描述】:

有人能解释一下 Spring xml 配置文件中 bean 的初始化顺序吗?在某些情况下,它似乎取决于订单,但我找不到任何表明这一点的文件。使用单个配置文件时,bean 顺序似乎是独立的。但是,如果在父配置中覆盖 bean,则顺序可能很重要。我需要做额外的测试来确认究竟是什么情况导致了这个失败。我正在使用 Spring 3.0.5 并使用配置文件通过模拟实现覆盖我的生产代码中的 bean。 bean 被自动装配到服务中,并且模拟对象是需要覆盖的原因。对此的任何见解将不胜感激。

【问题讨论】:

    标签: xml spring configuration autowired


    【解决方案1】:

    顺序有时很重要,我可以想到这些情况:

    1. 稍后使用完全相同的名称定义的 Bean 会覆盖之前定义的 Bean - 因此,如果您对某些 Bean 进行了模拟,只需在加载核心应用程序 Bean 后定义它即可。
    2. BeanFactoryPostProcessors 和 BeanPostProcessor 的处理基于它们的定义位置或基于order 属性(如果存在)。
    3. AOP 建议基于 order 属性执行。

    第 1 点似乎涵盖了您的情况,但我只是为了完整起见指定了其他情况,但其他 SO 用户可以添加的内容肯定更多。

    【讨论】:

    • 我在子上下文中的模拟 bean 正在覆盖父上下文中具有相同名称的 bean。子上下文导入父上下文。我认为这意味着父上下文已初始化,然后是子上下文,但似乎并非如此。您能否阐明如何确保在覆盖之前完全加载一个上下文文件?
    • 说如果你现在在你的子上下文中有一个带有 bean1 - <bean name="bean1".../>parent-context.xml 文件,你必须这样做:<import resource="parent-context.xml"> <bean name="bean1" class="mock"/>,在这种情况下,因为你在子上下文中定义了 bean1在你的父类导入之后,子类中的那个会生效,而不是如果你这样做<bean name="bean1" class="mock"/><import resource="parent-context.xml"/>,所以现在父上下文是在子bean定义后导入的,所以父bean将生效
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2018-06-20
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多