我正在Spring Boot中创建rest api,我需要有关在Spring中使用构建器模式的最佳方法的建议,因为我是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]中更新了对象HTTP Request 1,但每次都需要新对象。

所以我尝试了以下解决方案,但无法正常工作

@Configuration
public class ModelBuilderConfiguration {

    @Bean
    @Scope(value = "prototype")
    public ProductBuilder productBuilder(){
        return new ProductBuilderImpl();
    }
}


并在initMethod中创建ProductBuilderImpl以创建新对象。

@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;
    }
}


xyzServiceImpl一样在ProductBuilder productBuilder = new ProductBuilderImpl();中使用它,这样我每次都会得到新对象。

那么考虑弹簧的最佳方法是什么?或建议用于初始化Product对象的更好方法。

最佳答案

如果每次发出请求时都想要一个新的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;
    }

}

10-02 10:24