服务组件的范围

时间:2014-06-30 12:38:39

标签: java spring spring-mvc

我正在开发一个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不包含状态。

这是真的吗? 遵循范围的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

我会让服务无国籍,让它成为单身。

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

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

服务通常是无状态的东西 - 它只是一组方法,可以让您与应用程序的另一部分(或其他应用程序)进行通信。