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

标签 java spring dependency-injection inject

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

相关文章:

grails - 如何在 Grails 域类中使用接口(interface)类型对象

java - “找不到或加载主类”是什么意思?

java - 在获取 UTC Android 中的实际时间时遇到问题

Java Tic Tac Toe 错误

spring - 如何以编程方式访问 Spring Boot 应用程序的名称?

javascript - 如何使用Ajax调用Java Controller 正确获取用户定义的对象?

java - 了解 Dagger2 流程(提供的示例)

java - 如何从静态主方法依赖注入(inject)运行时参数

java - 类似于 FakeWeb for Java 的功能

java - @SpringBootApplication 无法解析为 STS 中的类型