最佳实践是什么:使用原型bean代替new()运算符

时间:2019-01-03 05:45:45

标签: java spring prototype javabeans

我试图了解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()运算符。     为您的观点提供理由。

3 个答案:

答案 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容器不知道)。