gpt4 book ai didi

java - 如何在没有applicationContext的情况下在Spring服务类中请求Prototype bean

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:19:38 27 4
gpt4 key购买 nike

我有一个用原型(prototype)范围定义的组件。我想在我的服务类中使用该组件。我希望每次调用时 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 的新实例,但我也听说这是一种不好的做法。请帮助我进行最佳实践。

最佳答案

使用 ObjectProvider懒惰地得到你想要的结果。然而,第一个原型(prototype)范围的 bean 不会在 beans 列表中表示,因为它们是原型(prototype)范围的。

@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());
}
}

此外,如果您不需要为您的对象进行所有依赖注入(inject)、代理创建等操作,那又何必呢。在 Spring 应用程序中只使用 new 关键字没有任何问题。并非所有事情都必须由 Spring 管理。

关于java - 如何在没有applicationContext的情况下在Spring服务类中请求Prototype bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55096855/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com