Какая область для компонента обслуживания

#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 или нет. Общий подход заключается в том, чтобы избегать совместного использования состояния и максимально использовать классы без состояния.

Служба обычно не имеет состояния — это просто набор методов, которые позволяют вам взаимодействовать с другой частью вашего приложения (или другого приложения).