Java—业务服务、数据访问对象—是否应使用单例?

Java—业务服务、数据访问对象—是否应使用单例?,java,singleton,Java,Singleton,考虑一个具有业务层和数据访问层的web应用程序。因此,每个请求都必须通过这两个层才能得到处理 因为会有频繁的请求,所以创建新的业务和数据访问对象来处理每个请求是不明智的。在这种情况下,我通常倾向于选择单例业务和DAO 但是我听到很多关于使用单例模式的问题,正如许多人反对这种模式的建议(主要是因为它是全局的)。在这种情况下,我上面描述的场景的正确设计策略是什么?服务对象应该是单例的 您可以使用来维护单例服务对象。在这种情况下,通常使用的策略是将业务服务和数据访问对象编写为简单的POJO,而不是编写

考虑一个具有业务层和数据访问层的web应用程序。因此,每个请求都必须通过这两个层才能得到处理

因为会有频繁的请求,所以创建新的业务和数据访问对象来处理每个请求是不明智的。在这种情况下,我通常倾向于选择单例业务和DAO


但是我听到很多关于使用单例模式的问题,正如许多人反对这种模式的建议(主要是因为它是全局的)。在这种情况下,我上面描述的场景的正确设计策略是什么?

服务对象应该是单例的


您可以使用来维护单例服务对象。

在这种情况下,通常使用的策略是将业务服务和数据访问对象编写为简单的POJO,而不是编写为单例。然后使用容器来管理类的范围。容器的一些例子是Spring和Guice。如果您的需求很简单,您甚至可以编写自己的容器

通过这种方式,您可以在不存在缺点(难以模拟和测试等)的情况下获得singleton模式的好处

一个简单的例子:

public class PersonService {
    public Person getPerson(String id) {
        //find and return the person
    }
}

public class PersonServiceSingletonFactory {
    private PersonService service = new PersonService();
    PersonService getInstance() {
        return service;
    }
}

我不认为在Servlet上编写单例是个好主意,您可以在ServletContextListener上创建您的业务逻辑,它将确保容器中只运行一个对象实例,并且是线程安全的。您可以通过@abhin4v解释的方式访问它。除非您使用的是Spring框架,否则这就是您需要做的


希望能有帮助

您需要小心区分“单例”(这很好)和“单例设计模式”(这是一种代码味道)。后者是实现前者的一种方式。如果我不使用Spring怎么办?@Veera,如果它是可管理的,你应该使用它,它有很多优点。嗯,我使用的是Struts 2。我不确定这两个框架结合得有多好。@Veera,Spring可以与Struts集成,这将是一个很好的选择。要在服务层使用Spring,请查看本文和示例: