没有@Autowired的Spring Prototype-Bean Provider

时间:2017-10-10 09:14:25

标签: java spring

我有一个原型Bean,它由一个带有Provider

的单例bean实例化
@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;请参阅下面的详细信息。

2 个答案:

答案 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;
        }
    }
}