将javax.inject.Provider与Spring@Scope(BeanDefinition.Scope\u原型)一起使用

将javax.inject.Provider与Spring@Scope(BeanDefinition.Scope\u原型)一起使用,java,spring,dependency-injection,inject,Java,Spring,Dependency Injection,Inject,有人能解释一下,将提供者和SCOPE_原型结合起来有意义吗。因为,每次SocketSender被注入时,我都会得到一个新的SocketSender对象,因为SCOPE_PROTOTYPE?把这两者结合起来似乎毫无意义。请参阅下面的代码。这两种实现在任何方面都有区别吗?提前谢谢 @Configuration public class SpringConfiguration { @Bean @Scope(BeanDefinition.SCOPE_PROTOTYPE) public So

有人能解释一下,将提供者和SCOPE_原型结合起来有意义吗。因为,每次SocketSender被注入时,我都会得到一个新的SocketSender对象,因为SCOPE_PROTOTYPE?把这两者结合起来似乎毫无意义。请参阅下面的代码。这两种实现在任何方面都有区别吗?提前谢谢

@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();
  }  
}
@配置
公共类配置{
@豆子
@范围(BeanDefinition.Scope\u原型)
公共SocketSender getSender(){
返回新的SocketSender();
}
}
//首次实施
类MyServiceImpl{
私有提供者socketSender;
@注入
公共MyServiceImpl(提供程序socketSender){
this.socketSender=socketSender;
}
公共无效剂量测定法(){
socketSender.get().doNotherthing();
}  
}
//第二次实施
类MyServiceImpl{
私人SocketSender SocketSender;
@注入
公共MyServiceImpl(SocketSender SocketSender){
this.socketSender=socketSender;
}
公共无效剂量测定法(){
socketSender.doNotherthing();
}  
}

基本上这取决于您所做的,有时使用
提供者是一个好选择,有时则不是

例如,如果您有一些类
MyService
需要一个名为
MyBuilder
的bean,它应该为
foo
方法的每次调用创建(因为它在内部保存状态),那么使用
MyBuilder
的原型范围和
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只在初始化singleton时将原型注入singleton一次,而且它的引用总是相同的

要解决此问题,您可以使用
提供程序

class MyService {

    private Provider<MyBuilder> myBuilder;

    public void foo(int param) {
         Product p = myBuilder.get().withParam(param).build();
         ...
    }
}
classmyservice{
私人提供商myBuilder;
公共void foo(int参数){
产品p=myBuilder.get().withParam(param.build();
...
}
}

现在,每次调用
Provider上的
get
时,对
foo
方法的不同调用都会处理
myBuilder

的不同实例(因此每次方法调用都会得到一个新实例)。如果不这样做,每次都会得到相同的实例。