我试图了解Spring原型bean的正确用法。 可能以下代码示例将帮助您理解我的困境:
List<ClassA> caList = new ArrayList<ClassA>();
for (String name : nameList) {
ClassA ca = new ClassA();
//or Shall I use protypebean, using method lookup I can inject the dependency of ClassA.
// ClassA ca = getPrototypeClassA();
ca.setName(name);
caList.add(ca);
}
所以我的确切意思是在这种情况下,我应该使用方法注入或new()运算符。 为您的观点提供理由。
答案 0 :(得分:3)
您可以使用任何一种方法,因为最终客户代码负责处理原型bean(而不是spring容器)的生命周期。
根据Spring-docs
从某些方面来说, 在谈论原型范围的bean可以代替 Java的“新”运算符。 由客户处理。
Spring无法管理原型Bean的完整生命周期: 容器实例化,配置,装饰和组装 一个原型对象,将其交给客户端,然后就没有了 该原型实例的知识。这是 客户端代码清理原型作用域对象并释放任何 原型bean所拥有的昂贵资源。
答案 1 :(得分:0)
看来您的实例需要一些运行时值才能正确初始化。在这种情况下,取决于您是否需要对ClassA实例使用spring功能(例如AOP)。如果是,请使用方法注入。否则,可以考虑使用工厂模式。对我来说,更多的面向对象和清洁器:
类似以下内容。你应该明白这个主意。
@Component
public class FactoryForClassA {
@Autowired
private FooBean someDependencyForClassA;
public ClassA create(String name){
ClassA a = new ClassA(someDependencyForClassA);
a.setName(name);
return a;
}
}
和客户端代码:
@Autowired
private FactoryForClassA factoryForClassA;
List<ClassA> caList = new ArrayList<ClassA>();
for (String name : nameList) {
ClassA a = factoryForClassA.create(name);
caList.add(ca);
}
答案 2 :(得分:0)
如果ClassA
需要引用@Autowired
,则选择原型bean。
否则,将使用一个简单的POJO(Spring容器不知道)。