【发布时间】:2019-03-11 07:18:53
【问题描述】:
我有一个使用原型范围定义的组件。我想在我的服务类中使用该组件。我希望 spring 在我每次调用它时为我提供一个该 Bean 的新实例。
组件类:
@Getter
@Setter
@Component
@Scope("prototype")
public class ProtoTypeBean {
//.. Field variables
}
服务类:
@AllArgsConstructor
@Service
public class ServiceClass {
ProtoTypeBean prototypeBean;
ArrayList<ProtoTypeBean> prototypeBeans;
public void demoMethod(ArrayList<String> someArrayList) {
for(var singleString: someArrayList) {
prototypeBean.setFieldValue(singleString);
prototypeBeans.add(prototypeBean);
}
System.out.println(prototypeBeans.toString());
}
}
通过使用此配置,我在我的prototypeBeans ArrayList 中获得了相同的ProtoTypeBean 实例。问题是,每次我在 foreach 循环中调用它时,我如何让 Spring 理解给我一个新的 prototypeBean 实例? 我发现我可以使用 ApplicationContext.getBean() 在 foreach 循环中获取 Bean 的新实例,但我也听说这是一种不好的做法。所以请帮助我进行最佳实践。
【问题讨论】:
-
你有相同的对象,因为它只被注入到这个类中,所以只创建一个新实例
-
作用域代理不起作用,因为它会为您执行的每个方法调用提供一个新实例。可能几乎不是你想要的。相反,您可以注入
Provider或ObjectFactory。
标签: java spring spring-boot oop dependency-injection