私は春のブートで残りのAPIを作成しています。私はSpringに新しいので、SpringのBuilderパターンを使用する最良の方法について提案が必要です。残念ながらSpringのビルダーパターンを使用する
Product.java(データベース・エンティティ)
public class Product{
private String name;
private String sku;
//getter-setter
}
ProductBuilder.java
public interface ProductBuilder {
public ProductBuilder setBasicDetails(String name, String sku)
}
ProductBuilderImpl.java
public class ProductBuilderImpl implements ProductBuilder{
// issue is with creating new object of `Product`
@Override
public ProductBuilder setBasicDetails(String name, String sku) {
product.setName(name);
product.setSku(sku);
return this;
}
}
Product
の新しいオブジェクトを作成するための提案は、以下のアプローチで複数HTTPRequest
のために。
アプローチ1:@Autowired
ProductBuilder。
@Service
public class xyzServiceImpl implements xyzService{
@Autowired
private ProductBuilder productBuilder;
// business logic
}
xyzServiceImpl
のでProductBuilder
はProduct
の唯一のオブジェクトとその共有
Thread
/Request
間のHTTPリクエスト1作成しますシングルトンです:保存を実行
Product
が
id = null
で初期化された>>を
id = 123
HTTPリクエスト2:オブジェクトを取得[Product.id = 123]
はiを更新しましたn HTTP Request 1
でも毎回新しいオブジェクトが必要です。
だから私は、次の解決方法を試してみましたが、
@Configuration
public class ModelBuilderConfiguration {
@Bean
@Scope(value = "prototype")
public ProductBuilder productBuilder(){
return new ProductBuilderImpl();
}
}
を働いて、新しいオブジェクトを作成するためにProductBuilderImpl
でinitMethod
を作成していません。
@Configuration
public class ModelBuilderConfiguration {
@Bean(initMethod = "initMethod")
@Scope(value = "prototype")
public ProductBuilder productBuilder(){
return new ProductBuilderImpl();
}
}
と私は@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
を使用しましたが、これも機能しません。
ThreadLocal
を使用すると、@Autowired
と併用することをおすすめしますか?
public class ProductBuilderImpl implements ProductBuilder{
private ThreadLocal<Product> product = new ThreadLocal<Product>(){
@Override
protected Product initialValue() {
return new Product();
}
};
@Override
public ProductBuilder setBasicDetails(String name, String sku) {
product.get().setName(name);
product.get().setSku(sku);
return this;
}
}
アプローチ2:コンストラクタで新しいオブジェクトを作成します。
public class ProductBuilderImpl implements ProductBuilder{
private Product product;
public ProductBuilderImpl() {
product = new Product();
}
@Override
public ProductBuilder setBasicDetails(String name, String sku) {
product.setName(name);
product.setSku(sku);
return this;
}
}
そして私は、新しいオブジェクトを毎回取得しますProductBuilder productBuilder = new ProductBuilderImpl();
ようxyzServiceImpl
でそれを使用しています。
春を考えるのに最適な方法は?または、Product
オブジェクトを初期化するためのより良い方法を提案してください。
スプリングコンテナで管理したいすべてのオブジェクトをオートワイヤリングする必要があります。自分で作成するかのように、そのライフサイクルはSpring Containerによって管理されません – Mohit