每次使用查找方法和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在启动时返回此错误:
"XMLPortletContext资源中的文档无效"
错误似乎是因为
当我试图在上面的XML中实现时,如何在字符串属性中配置Spring查找方法?
查找方法注入是容器覆盖容器托管bean上的方法的能力,以返回容器中另一个命名bean的查找结果。
现在,假设您想在myclass
(它是一个单例bean)中每次调用方法(让它是createDefaultUri
)时获得一个新的DefaultUri
实例(它是一个原型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
实例。
您现在可以在Myclass
bean定义中定义lookup-method
名称如下:
<bean id="defaultUri" scope="prototype" class="DefaultUri">
</bean>
<bean id="myBean" class="com.myclass"
<lookup-method name="createDefaultUri" bean="defaultUri" />
</bean>
假设单例bean A需要使用非单例(原型)bean B,也许在A上的每个方法调用(getBeanB())上,我们期望每次请求都能得到bean B的新实例。但是容器只创建一次单例bean A,因此只有一次设置属性的机会。容器不能在每次需要时都为bean A提供一个新的bean B实例。要为每个请求获得新的bean B实例,我们需要使用查找方法注入
请参考http://www.javapointer.com/spring/spring-core/spring-lookup-method-injection/