有人可以解释一下,将 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/