我正在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;
}
}