在bean之间共享同一数组的最佳方法是什么?

时间:2019-01-21 21:27:22

标签: java spring spring-boot

我有带有带有new关键字的初始化组件的旧代码。现在,我正在使用spring-boot并对其进行重构。在代码中,我具有共享服务bean中定义的同一数组的组件。就像这样:

@Componet
public class ComponentFirst {

  public void writeIntoByteArray(String someData, ByteWriter writer) {
   //logic to work with string someData
   writer.putString(someData changed according logic)
  }

}

@Componet
public class ComponentSecond {

  public void writeIntoByteArra(long longValue, ByteWriter writer) {
   //logic to work with longValue
   writer.putLong(longValue changed according logic)
  }

}

@Service
public class ByteWriter {

  private array = new array[256];
  @Autowired
  private ComponentFirst logicForString;
  @Autowired
  private ComponentSecond logicForLong;

  public void writeString(String someData) {
   logicForString.writeIntoByteArray(someData, this)
  }

  public void writeLong(long longValue, this) {
   logicForLong.writeIntoByteArray(longValue, this)
  }

}

ByteWriter应该在单例的不同控制器中初始化。每个ByteWriter应该具有自己的单独数组。我的想法是使用工厂模式,但这也许是更优雅的方法。

所以问题是创建ByteWriter并将其注入控制器(如原型)的最佳方法是什么,原型将具有独立的数组,使用该数组的组件将写入数据?

更新并回答:

我选择了原型生成和对象工厂,因为代理将根据每种方法的调用创建对象,这将导致数据丢失。原因我没有我应该关闭的任何资源-gc将收集不再使用的bean。

Spring Prototype scoped bean in a singleton

1 个答案:

答案 0 :(得分:0)

您应该查看ScopedProxyMode。参见Spring参考文档here

这就是Spring处理较小范围的bean(例如HTTP请求范围的bean)的方式,该小范围的bean被注入到寿命更长的另一个bean中。

您需要将ScopedProxyMode添加到ByteWriter类。

@Service
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype")
public class ByteWriter {
   ...
}

// Controller1
@Component
public class Controller1 {

    @Autowired
    private ByteWriter byteWriter;

    public void process() {
       // For every invocation, a new ByteWriter instance will be given to you.
       byteWriter.writeString("some data");
    }
}

其他单例控制器也一样。

请注意,还支持其他几个ScopedProxyMode。 确保您了解其工作原理以及为每次调用创建代理的成本。