gpt4 book ai didi

java - 将 java javax.inject.Provider 与 Spring @Scope(BeanDefinition.SCOPE_PROTOTYPE) 一起使用

转载 作者:行者123 更新时间:2023-12-01 19:33:17 25 4
gpt4 key购买 nike

有人可以解释一下,将 Provider 与 SCOPE_PROTOTYPE 结合起来是否有意义。因为,每次 SocketSender 被注入(inject)时,由于 SCOPE_PROTOTYPE,我都会得到一个新的 SocketSender 对象?看来把这两者结合起来是没有意义的。请参阅下面的代码。这两种实现方式有什么区别吗?提前致谢。

@Configuration
public class SpringConfiguration {

@Bean
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public SocketSender getSender() {
return new SocketSender();
}
}


//First implementation
class MyServiceImpl{
private Provider<SocketSender> socketSender;

@Inject
public MyServiceImpl(Provider<SocketSender> socketSender){
this.socketSender=socketSender;
}

public void doSomething(){
socketSender.get().doAnotherThing();
}
}


//Second implementation
class MyServiceImpl{
private SocketSender socketSender;

@Inject
public MyServiceImpl(SocketSender socketSender){
this.socketSender=socketSender;
}

public void doSomething(){
socketSender.doAnotherThing();
}
}

最佳答案

基本上这取决于您的用途,有时使用 Provider 是一个不错的选择,有时则不是。

例如,如果您有一些类 MyService 需要一个名为 MyBuilder 的 bean,则应为每次调用 foo 方法创建该 bean (因为它在内部保存状态)那么使用 MyBuilder 的原型(prototype)作用域和 MyService 的单例作用域是有意义的。

如果我们使用简单的实现:

// singleton bean
class MyService {

// defined as a prototype in spring, but what about injection?
@Autowired
private MyBuilder myBuilder;

public void foo(int param) {
Product p = myBuilder.withParam(param).build();
...
}
}

如果无法按预期工作:myBuilder 对象将被重用,它将始终是相同的对象...发生这种情况是因为 Spring 仅在单例初始化时将原型(prototype)注入(inject)单例一次,并且始终是相同的引用。

为了解决这个问题,您可以使用Provider:

class MyService {

private Provider<MyBuilder> myBuilder;

public void foo(int param) {
Product p = myBuilder.get().withParam(param).build();
...
}
}

现在 foo 方法的不同调用将适用于 myBuilder 的不同实例。

关于java - 将 java javax.inject.Provider 与 Spring @Scope(BeanDefinition.SCOPE_PROTOTYPE) 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59243400/

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