#java #spring #spring-mvc
#java #весна #spring-mvc
Вопрос:
Я разрабатываю веб-приложение Java, в котором я использую контейнер приложений, подобный spring, и веб-фреймворк, подобный 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 я прочитал следующие предложения:
Как правило, используйте область прототипа для всех компонентов с сохранением состояния и одноэлементную область для компонентов без состояния.
Затем я перевожу эти предложения следующим образом:
Если мой компонент (в данном случае это сервис) имеет некоторые переменные с областью действия на уровне класса
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));
}
}
в этом случае область должна быть прототипом, потому что многие клиенты могут совместно использовать состояние этой службы. Вместо этого в первом определении класса обслуживания я мог бы использовать одноэлементную область, потому что этот компонент не содержит состояния.
Это правда? Какова наилучшая практика для определения области?
Ответ №1:
Я бы сделал службу без состояния и позволил ей быть одноэлементной.
Обратите внимание, что если customerRepository
и customerDetailsRepository
сами не имеют состояния, то вам просто нужно удалить objectToProcess
, чтобы сделать класс без состояния.
Вы должны выбрать область независимо от того, используете ли вы Spring или нет. Общий подход заключается в том, чтобы избегать совместного использования состояния и максимально использовать классы без состояния.
Служба обычно не имеет состояния — это просто набор методов, которые позволяют вам взаимодействовать с другой частью вашего приложения (или другого приложения).