首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring @Scope(BeanDefinition.SCOPE_PROTOTYPE)中使用java

在Spring @Scope(BeanDefinition.SCOPE_PROTOTYPE)中使用java
EN

Stack Overflow用户
提问于 2019-12-09 14:11:54
回答 1查看 410关注 0票数 0

有没有人能解释一下,把Provider和SCOPE_PROTOTYPE结合起来有意义吗?因为,每次注入SocketSender时,我都会因为SCOPE_PROTOTYPE而获得一个新的SocketSender对象。将这两者结合起来似乎是没有意义的。请看下面的代码。这两个实现之间有什么区别吗?提前谢谢。

代码语言:javascript
复制
@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();
  }  
}
EN

回答 1

Stack Overflow用户

发布于 2019-12-09 15:17:00

基本上,这取决于你使用什么,有时使用Provider是一个好的选择,有时不是。

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

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

代码语言:javascript
复制
// 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

代码语言:javascript
复制
class MyService {

    private Provider<MyBuilder> myBuilder;

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59243400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档