有没有人能解释一下,把Provider和SCOPE_PROTOTYPE结合起来有意义吗?因为,每次注入SocketSender时,我都会因为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();
}
}发布于 2019-12-09 15:17:00
基本上,这取决于你使用什么,有时使用Provider是一个好的选择,有时不是。
例如,如果您有一些类MyService需要一个名为的bean,则应该为每次调用foo方法创建MyBuilder (因为它在内部保存状态),那么对MyBuilder使用prototype作用域,对MyService使用singleton作用域是有意义的。
如果我们使用简单的实现:
// 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注入到单例中一次,而且总是使用相同的引用。
为了解决这个问题,您可以使用Provider
class MyService {
private Provider<MyBuilder> myBuilder;
public void foo(int param) {
Product p = myBuilder.get().withParam(param).build();
...
}
}现在,不同的foo方法调用将适用于不同的myBuilder实例。
https://stackoverflow.com/questions/59243400
复制相似问题