Spring 経由で注入されるいくつかのリソースを使用するBuilderがあります。これは次のようになります。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class SandBoxBuilder {
private final SandUtil sandUtil;
private Sand sand;
private Box box;
@Autowired
public SandBoxBuilder(SandUtil sandUtil) {
this.sandUtil = sandUtil;
}
public SandBoxBuilder setSand(Sand sand) {
this.sand = sand;
return this;
}
public SandBoxBuilder setBox(Box box) {
this.box = box;
return this;
}
public SandBox build() {
SandBox sandBox = new SandBox(sand);
sandUtil.changeBox(sandBox, box);
return sandBox;
}
}
これに関する問題は、スレッドセーフではないことです。このビルダーはシングルトンであってはならないことはわかっていますがSandUtil
、ビルダーを配線して使用する場所に注入せずに、Spring 注入リソース ( ) を使用する方法がわかりません。
春によって注入されたシングルトンを利用するスレッドセーフビルダーを実装するにはどうすればよいですか?
解決
いくつかのアーキテクチャ上の制約により、呼び出しクラスにユーティリティを挿入できませんでした。最終的に、Spring リソースへの参照を持つビルダーの新しいインスタンスを返すファクトリー ビルダー Bean を実装しました。
ソリューションの実装
@Component
public class SandBoxBuilderFactory {
private final SandUtil sandUtil;
@Autowired
public SandBoxBuilderFactory(SandUtil sandUtil) {
this.sandUtil = sandUtil;
}
public Builder newBuilder(){
return new Builder(sandUtil);
}
public static class Builder {
private final SandUtil sandUtil;
private Sand sand;
private Box box;
private Builder(SandUtil sandUtil) {
this.sandUtil = sandUtil;
}
public Builder setSand(Sand sand) {
this.sand = sand;
return this;
}
public Builder setBox(Box box) {
this.box = box;
return this;
}
public SandBox build() {
SandBox sandBox = new SandBox(sand);
sandUtil.changeBox(sandBox, box);
return sandBox;
}
}
}
使用法
newBuilder().setBox(box).setSand(sand).build();