【发布时间】:2014-06-30 12:38:38
【问题描述】:
我正在开发一个 java web 应用程序,我使用类似 spring 的应用程序容器和类似 web 框架的 vaadin。我是 spring 的新手,现在我对一些组件的范围有些担心。在我的应用程序中,我不使用 spring MVC,但我的业务逻辑位于服务层中。现在我试着用一个例子更好地解释我的情况。
如果我必须处理一些对象,然后保存这些对象的内容,我将拥有:
Vaadin 面板
public class ImportaCustomersPanel extends BasePanel{
private static final long serialVersionUID = 1L;
private Button importButton;
private List<MyObject> objectToProcess;
@Autowired
ImportService importService;
public ImportaClientiSitiContrattiPanel() {
super();
Injector.inject(this);
//Other Components
addListenes();
}
@SuppressWarnings("serial")
private Button makeButtonEsporta() {
importButton = new Button();
importButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
importService.process(objectToProcess);
}
});
}
}
春季服务
@Service
public class ImportServiceImpl implements ImportService {
@Autowired
CustomerRepository customerRepository;
@Autowired
CustomerDetailsRepository customerDetailsRepository;
@Transactional(propagation=Propagation.REQUIRES_NEW,rollbackFor=Exception.class)
public ImportClienteSitiContrattiDTO process(List<MyObject> objectToProcess) throws Exception {
//I apply some business rule and persist the entities
customerRepository.save(objectToProcess.save(0));
customerDetailsRepository.save(objectToProcess.save(1));
}
}
现在从 spring 参考文档中我读到了以下句子:
作为一项规则,对所有有状态 bean 使用原型范围,对无状态 bean 使用单例范围。
那我这样翻译这句话:
如果我的 bean(在这种情况下是服务)有一些变量,其范围在级别类
public class ImportServiceImpl implements ImportService {
@Autowired
CustomerRepository customerRepository;
@Autowired
CustomerDetailsRepository customerDetailsRepository;
private List<MyObject> objectToProcess;
@Transactional(propagation=Propagation.REQUIRES_NEW,rollbackFor=Exception.class)
public ImportClienteSitiContrattiDTO process(List<MyObject> objectToProcess) throws Exception {
this.objectToProcess = objectToProcess
//I apply some business rule and persist the entities
customerRepository.save(objectToProcess.save(0));
customerDetailsRepository.save(objectToProcess.save(1));
}
}
在这种情况下,范围应该是原型,因为许多客户端可以共享此服务的状态。相反,在服务类的第一个定义中,我可以使用单例范围,因为该 bean 不包含状态。
这是真的吗? 评估范围的最佳做法是什么?
【问题讨论】:
标签: java spring spring-mvc