如何使用Spring属性配置Spring查找方法

时间:2013-11-28 09:07:59

标签: java spring spring-mvc

每次使用查找方法和Spring依赖注入调用bean(myBean)时,我都会尝试注入一个属性:

<bean id="myBean" class="com.myclass"
        <property name="default" ref="myDefault" >
            <lookup-method name="getUri" bean="defaultUri" />
        </property>
</bean>
    <bean id="defaultUri" scope="prototype" class="DefaultUri" >        
    </bean>

class myclass {
 public String getUri(){
    return "test"
 }
}

以上XML在启动时返回此错误:

“来自PortletContext资源的XML文档无效”

错误似乎是因为<lookup-method name="getUri" bean="defaultUri" />配置错误。

如何在String'属性'中配置Spring查找方法,因为我正在尝试在上面的XML中实现它?

2 个答案:

答案 0 :(得分:12)

查找方法注入是容器覆盖容器托管bean上的方法的能力,以返回容器中另一个命名bean的查找结果。

现在,假设您希望每次在DefaultUri中调用方法(让它为createDefaultUri)时获取myclass(这是一个原型bean)的新实例(其中是一个单身豆)。然后,您可以将MyClass定义为:

class abstract Myclass {
 public String getUri(){
    // create a new instance of DefaultUri
    DefaultUri defaultUri = createDefaultUri();
    return "test"
 }

 protected abstract DefaultUri createDefaultUri();
}

Spring Framework将生成Myclass的动态子类,该子类将覆盖createDefaultUri方法,以便在每次请求时提供DefaultUri的新实例。

您现在可以在lookup-method bean定义中定义Myclass名称的名称:

<bean id="defaultUri" scope="prototype" class="DefaultUri">
</bean>

<bean id="myBean" class="com.myclass"
        <lookup-method name="createDefaultUri" bean="defaultUri" />
</bean>

答案 1 :(得分:1)

假设单例bean需要使用非单例(原型)bean B,可能在A(getBeanB())上的每个方法调用上,我们希望为每个请求获取bean B的新实例。但是容器只创建一次单例bean A,因此只有一次机会来设置属性。每次需要时,容器都不能为bean A提供bean B的新实例。要为每个请求获取新的bean B实例,我们需要使用lookup-method injection

请参阅http://www.javapointer.com/spring/spring-core/spring-lookup-method-injection/