2017-10-25 2 views
1

私は春のブートで残りの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のでProductBuilderProductの唯一のオブジェクトとその共有

Thread/Request間のHTTPリクエスト1作成しますシングルトンです:保存を実行 Productid = 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(); 
    } 
} 

を働いて、新しいオブジェクトを作成するためにProductBuilderImplinitMethodを作成していません。

@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オブジェクトを初期化するためのより良い方法を提案してください。

+0

スプリングコンテナで管理したいすべてのオブジェクトをオートワイヤリングする必要があります。自分で作成するかのように、そのライフサイクルはSpring Containerによって管理されません – Mohit

答えて

0

リクエストがあるたびに新しいProductオブジェクトが必要な場合は、初期化のためにSpringに依存し、ビルダーのことを忘れてしまいます。それをマネージドBeanにして、リクエストするスコープを設定します。あなたは次のようにすることができます:

@ManagedBean // or @Component 
@RequestScope // or @Scope("request") 
public class Product { 
    ... 
} 

そしてあなたのサービスにそれを注入してください。

@Service 
public class XyzServiceImpl implements XyzService{ 

    private final Product product; 

    // A proxy is injected, not the actual object. 
    @Inject // or @Autowired or none 
    public XyzServiceImpl(Product product) { 
     this.product = product; 
    } 

} 
関連する問題