Spring:按名称获取内联bean

时间:2010-11-04 14:47:45

标签: java xml spring javabeans

我想用它的名字来获取内部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( “子”)。 Spring找不到这样的bean(因为它是内在的)。同时.getBean(“parent”)工作正常。

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

你做不到。

来自the docs

  

或元素内的元素用于定义所谓的内部bean。内部bean定义不需要定义任何id或名称,最好不要指定任何id或名称值,因为容器将忽略id或name值。< / p>

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

答案 1 :(得分: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>

答案 2 :(得分:1)

除了其他(大多数是有效的)答案和解决方案之外,我想春天的方式是使用BeanWrapper界面:

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

但我想这意味着必须为该物业提供一个吸气剂(不仅仅是一个定位器)。

<强>参考:

答案 3 :(得分:0)

如果你升级到Spring 3.x,你应该能够使用Spring Expression Language。有一些例子直接从另一个属性引用bean属性(比如link text)。从Java执行此操作的代码有点类似,但我找不到此方案的确切示例。

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