Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Spring创建非bean实例_Spring_Jsr330 - Fatal编程技术网

使用Spring创建非bean实例

使用Spring创建非bean实例,spring,jsr330,Spring,Jsr330,我相信这个问题以前已经被问过一百次了,但我似乎找不到这个问题,所以请随时让我参考其他答案 对于需要注入的非单例bean对象,大多数Spring用户会做什么?例如,我有像Customer这样的类,每次我都想实例化一个新的类。假设它是一个实体,我想在@PreRemove或其他地方注入侦听器进行迭代。通常的解决方案是使用@Configurable,但这似乎是一个解决办法,我想知道是否有更规范的方法来处理这些问题 我唯一能想到的就是在CustomerRepository类中创建一个FactoryNewC

我相信这个问题以前已经被问过一百次了,但我似乎找不到这个问题,所以请随时让我参考其他答案

对于需要注入的非单例bean对象,大多数Spring用户会做什么?例如,我有像Customer这样的类,每次我都想实例化一个新的类。假设它是一个实体,我想在@PreRemove或其他地方注入侦听器进行迭代。通常的解决方案是使用@Configurable,但这似乎是一个解决办法,我想知道是否有更规范的方法来处理这些问题

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

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


在Guice中是否会有不同的处理方式?如果只使用JSR-330特性,您将如何做到这一点?

如果您愿意,您可以使bean成为非单例的。取决于您对XML是否满意:

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

您在向客户对象中注入什么?这听起来很可疑。在那个特定的侦听器上,只有一组@PreRemove的任意侦听器。这就是处理需要注入的Customer类的方式吗?做个豆子?似乎有点过分了。我想我缺少了一种模式,这种模式比让每个可以注入的非服务对象都成为bean更好。如果它是bean,我仍然需要解释必须使用#getBean或类似的方法而不是“new Customer()”。你可以用一个静态的
getInstance()
方法来为你做到这一点。或如果使用“new Customer()”,则可以通过调用
getBean()
并存储,将代码放入构造函数中,手动注入任何内容。如果有很多,将注入器代码放在父构造函数中,并使其通用。我认为对于用户来说,最自然的做法是让CustomerEntity上下文感知,只需手动获取bean,而不是试图让它使用@Inject。我认为为类的用户创建一个契约来调用工厂方法来创建新实例太奇怪了。我没有办法强制使用这种用法。或者让它@Configurable:)
@Scope("prototype")