如何在没有applicationContext的Spring服务类中请求Prototype bean

Rit*_*Das 3 java oop spring dependency-injection spring-boot

我有一个使用原型范围定义的组件。我想在我的服务类中使用该组件。我希望 spring 在每次我调用它时都能为我提供该 Bean 的一个新实例。

组件类别:

@Getter
@Setter
@Component
@Scope("prototype")
public class ProtoTypeBean {
  //.. Field variables
}
Run Code Online (Sandbox Code Playgroud)

服务等级:

@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());
    }
}
Run Code Online (Sandbox Code Playgroud)

通过使用此配置,我在原型Beans ArrayList 中获得了相同的 ProtoTypeBean 实例。问题是,我如何让 Spring 理解每次在 foreach 循环中调用它时都会给我一个 prototypeBean 的新实例?我发现我可以使用 ApplicationContext.getBean() 在 foreach 循环中获取 Bean 的新实例,但我也听说这是一个不好的做法。请帮助我进行最佳实践。

M. *_*num 5

使用 anObjectProvider来延迟获得您想要的结果。然而,第一个原型作用域 bean 不会在 bean 列表中表示,因为它们是原型作用域的。

@AllArgsConstructor
@Service
public class ServiceClass {

    private final ObjectProvider<ProtoTypeBean> provider;

    public void demoMethod(ArrayList<String> someArrayList) {
        PrototypeBean pb = provider.getIfUnique();
        for(var singleString: someArrayList) {
            pb.setFieldValue(singleString);
            pb.add(prototypeBean);              
        }
        System.out.println(prototypeBean.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,如果您不需要为您的对象进行所有依赖注入、代理创建等,那么为什么还要麻烦呢。newSpring 应用程序中仅使用关键字并没有什么问题。并非所有事情都必须由 Spring 管理。