spring方法解决下面的问题:一个singleton bean A,在每次方法调用的时候都需要使用一个non-singleton bean B。而容器仅仅会一次性创建这个singleton bean A,因此,也仅有一次机会去设置它的属性。所以无法每次为bean A提供一个bean B的新实例属性。
通过放弃部分反向控制便可以解决这个问题,比如,bean A可以通过实现BeanFactoryAware,从而在需要的时候通过调用getBean("B")方法,向容器请求bean B的新实例。不过这种方法使运用代码耦合于spring。
而使用Lookup方法注射可以很好的解决这个问题。
Lookup方法注射指容器弄够在运行时重写Bean的抽象或具体方法,返回或创建容器中其他Bean实例。被创建的Bean通常是一个non-singleton bean(当然也可以是singleton的),在spring中,通过CGLIB修改客户端类上的二进制代码来实现这种注射。
包含方法直射的客户端类,应按如下形式定义抽象方法:
protected abstract SomeBean createSomeBean();
如果方法不是抽象的 ,spring会直接重写它。
配置如下:
<bean id="anotherBean" class="prodream.com.Bean_B" singleton="false"/>
<bean id="myBean" class=""prodream.com.Bean_A">
<lookup-method name="methodName"
bean="anotherBean"/>
</bean>