【问题标题】:Spring: Get inline bean by nameSpring:按名称获取内联bean
【发布时间】:2011-05-05 02:43:37
【问题描述】:

我想通过它的名字来获取内部 bean。 Spring API 可以吗?

现在我正在使用这样的 Spring 2.5 API

ConfigurableApplicationContext.getBean(String paramString)

XML 示例:

<bean id="parent" parent="t_Parent">
    <property name="items">
        <bean id="child" parent="t_Child">
            <property name="ABC" value="test"/>
        </bean>
    </property>
</bean>

我想通过 id "child" 获取内部 (t_Child) bean。例如。 ConfigurableApplicationContext.getBean("child")。 Spring找不到这样的bean(因为它是内部的)。同时 .getBean("parent") 工作正常。

有什么想法吗?

【问题讨论】:

    标签: java xml spring javabeans


    【解决方案1】:

    你不能。

    来自the docs

    或元素内的元素用于定义所谓的内部bean。内部 bean 定义不需要定义任何 id 或 name,最好不要指定任何 id 或 name 值因为 id 或 name 值会被容器忽略

    如果您需要这样,请将其定义为常规 bean。

    【讨论】:

    • BeanNameAware - 也许,但你不能用它来访问 bean,对吗?
    【解决方案2】:

    您不能,但您可以在外部创建内部 bean(因此它不再是内部 bean...),然后在属性中引用它:

    <bean id="child" parent="t_Child">
        <property name="ABC" value="test"/>
    </bean>
    
    <bean id="parent" parent="t_Parent">
        <property name="items" ref="child"/>
    </bean>
    

    【讨论】:

    • 为什么不那么方便?这样,如果您想引用它两次或多次,并且如果您需要检索内部 bean,为什么不使用父相应属性?
    • 取决于您的配置大小。当它很大时,您希望尽可能多地合并 bean。
    • 如果文件大小是问题,为什么不在多个文件中拆分配置?您可以使用“导入”来合并它们。
    • 您可以将您的内部 bean 放在一个专用的 xml 文件中,您可以在主文件的开头导入该文件... ;-)
    • 你知道,它总是在可读性、简单性和真实生活之间进行权衡。当我真的需要重用内部 bean 时,我会将它们提升为“标准”bean,否则我想遵循 KISS 原则en.wikipedia.org/wiki/KISS_principle
    【解决方案3】:

    除了其他(大部分是有效的)答案和解决方案之外,我猜春天的方式是使用BeanWrapper 接口:

    final BeanWrapper bw =
        new BeanWrapperImpl(applicationContext.getBean("parent"));
    Object innerBean = bw.getPropertyValue("child");
    

    但我想这意味着该属性必须有一个 getter(不仅仅是一个 setter)。

    参考:

    【讨论】:

      【解决方案4】:

      如果您升级到 Spring 3.x,您应该能够使用 Spring 表达式语言来执行此操作。有一些直接从另一个属性引用 bean 属性的示例(例如在 link text 中)。从 Java 中执行此操作的代码会有些相似,尽管我找不到这种情况的确切示例。

      但是,我想说,如果您尝试使用“getBean()”,那么您做错了什么。您可以在上下文中轻松使用 SpEL 来定义引用该内部 bean 的 bean 或 bean 属性。

      【讨论】:

        猜你喜欢
        • 2021-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-04
        • 1970-01-01
        • 2015-08-02
        • 1970-01-01
        • 2012-08-03
        相关资源
        最近更新 更多