我有带有带有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。
答案 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。 确保您了解其工作原理以及为每次调用创建代理的成本。