【问题标题】:What scope to service component服务组件的范围
【发布时间】: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


    【解决方案1】:

    我会让服务无状态并让它成为单例。

    请注意,如果 customerRepositorycustomerDetailsRepository 本身是无状态的,那么您只需删除 objectToProcess 以使类无状态。

    无论您是否使用 Spring,您都必须选择一个范围。避免共享状态并尽可能使用无状态类的常用方法。

    服务通常是无状态的——它只是让您与应用程序的另一部分(或另一个应用程序)通信的方法的集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-26
      • 2021-11-14
      • 2021-06-19
      • 2020-04-09
      • 2014-12-09
      • 1970-01-01
      • 2012-07-13
      • 2020-08-05
      相关资源
      最近更新 更多