我正在开发一个java Web应用程序,我在其中使用类似应用程序容器的弹簧和像web框架一样的vaadin。我是春天的新手,现在我对一些组件的范围有些担忧。在我的应用程序中,我不使用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));
}
}
现在从春季参考文献中我读了以下句子:
通常,对所有有状态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不包含状态。
这是真的吗? 遵循范围的最佳做法是什么?
答案 0 :(得分:0)
我会让服务无国籍,让它成为单身。
请注意,如果customerRepository
和customerDetailsRepository
本身是无状态的,那么您只需删除objectToProcess
即可使该类无状态。
无论是否使用Spring,都必须选择范围。它是避免共享状态和尽可能使用无状态类的常用方法。
服务通常是无状态的东西 - 它只是一组方法,可以让您与应用程序的另一部分(或其他应用程序)进行通信。