我有一个原型Bean,它由一个带有Provider
:
@Component
@Scope("prototype")
class MyPrototype {}
@Component
class MySingleton {
@Autowired
javax.inject.Provider<MyPrototype> prototypeFactory;
}
这很好,但我们公司规定不允许@Autowired
;常见模式为@Resource(SingletonBeanClass.BEAN_ID)
。
是否有可能以这种方式注释Provider
,以便Spring查找可以创建它?
我知道我可以使用@Lookup
或单件工厂bean添加工厂方法,但我更喜欢Provider
。
编辑:
我没有按照这种方式工作,最后不得不编辑spring.xml
;请参阅下面的详细信息。
答案 0 :(得分:1)
由于您有XML配置文件,您可以通过以下方式通过XML对其进行配置:
getPrototypeFactory()
通过这种方式,您必须使用apply pd.DataFrame
访问myPrototype,而不是直接访问该属性。您甚至可以删除这两个类的注释。
有关任何其他详细信息,请查看以下博文fiddle
答案 1 :(得分:0)
供参考,如果有人通过Google遇到此消息:
我最终需要在spring.xml
中声明它。我试过了@Lookup
,但是由于原型bean引用了另一个原型bean,即使这样也没有用。
这是recommended here的原因, 但不起作用:
@Component("proto1")
@Scope("prototype")
class MyPrototypeBean1 {
@Lookup(value="proto2")
protected MyPrototypeBean2 createBean2() { return null; }
}
@Component("proto2")
@Scope("prototype")
class MyPrototypeBean2 {
}
@Component("singleton")
class MySingleton {
@Lookup(value="proto1")
protected MyPrototypeBean1 createBean1() { return null; }
}
这会导致错误消息&#34;无法将@Lookup应用于bean而没有相应的bean定义&#34;当试图创建&#34; innerBean ...&#34;。
我认为这是由于&#34;查找方法无法替换从工厂方法返回的bean,我们无法为它们动态提供子类&#34;正如以上链接所引用的那样。
所以我最终在spring.xml
:
<bean name="proto2" class="my.package.PrototypeBean2" />
<bean name="proto1" class="my.package.PrototypeBean1" >
<lookup-method name="createBean2" bean="proto2" />
</bean>
<bean name="singleton" class="my.package.SingletonBean" >
<lookup-method name="createBean1" bean="proto1" />
</bean>
这很有效。
对于单元测试,我必须对各自的类进行子类化:
class SingletonUnitTest {
@Mock
MyPrototypeBean1 bean1;
@InjectMocks
DummySingleton sut;
@Before public void setBean1() {
sut.bean = bean1;
}
static class DummySingletonBean extends MySingeton {
MyPrototypeBean1 bean;
protected MyPrototypeBean1 createBean1() {
return bean;
}
}
}