2013-08-02 61 views
0

我确定这个问题已经被问过一百遍了,但是我似乎无法找到问题,所以请随时引用我其他的stackoverflow答案。用Spring创建非bean实例

大多数Spring用户对非单身bean需要注入的对象做什么?例如,我有类似Customer的类,我想每次都要实例化一个新类。可以说它是一个实体,我想注入监听器来遍历@PreRemove或其他地方。通常的解决方案是使用@Configurable,但这似乎是一种解决方法,我想知道是否有更经典的方法来处理这些问题。

我唯一能想到的是在我的CustomerRepository类中创建一个工厂newCustomer实例方法,这是一个托管bean。然后,不是将监听器注入Customer(最自然的地方),而是将它们注入到CustomerRepository中,并将它们指定为Customer ala new Customer(injectedListeners)的显式构造函数参数。

人们倾向于只使用可配置还是有更好的方法来注入非单例实例?或者大多数用户是否像上面那样创建工厂方法?实体示例只是一个示例,我有其他非单例对象,通常是新建的,但需要注入。

对于Guice这样的处理方式,这是否会有所不同?你会如何使用JSR-330功能?

+0

什么是你注入你的客户对象吗?这听起来很可疑。 –

+0

只是@PreRemove的任意一组监听器。 –

回答

0

如果你喜欢,你可以让豆非单身。取决于你对XML是否合适:

<bean id="beanA" class="misc.BeanClass" scope="prototype"> 
    <property ... /> 
</bean> 

每次都会给你一个新的实例。每个实例将使用注入的值进行初始化。

您可以使用此批注过:

@Scope("prototype") 
+0

是你如何处理需要注射的客户类?把它变成豆子?似乎过度。我想我错过了一个更好的模式,而不是让每个可以注入bean的非服务对象。 –

+0

如果它是一个bean,我仍然有解释必须使用#getBean或一些这样的设计,而不是“新的Customer()”的问题。 –

+1

你可以有一个静态的'getInstance()'方法来为你做。要么。如果你使用“new Customer()”,你可以在构造函数中放置代码,通过调用'getBean()'手动注入并存储。如果它们中有很多,则将该注入器代码放在父构造器中并使其通用。 –