我正在制作Java REST应用程序。我想知道我应该如何实现我的服务-我应该为整个应用程序使用静态服务变量还是像在Spring MVC中那样使服务成为单例。在应用期间,单例对象和仅初始化对象之间有什么区别?
答案 0 :(得分:3)
如果您想拥有一些实用方法或常量变量,则应该选择Static,而Singelton则是在类可以具有状态并且状态可以更改的情况下出现的(但对象仍然是一个)。
答案 1 :(得分:1)
将服务创建为单例,这样您就可以在运行时获得更大的灵活性,因为您可以注入服务的任何实现,而无需更改代码。如果您的想法是使用服务类共享某些变量,则将其标记为最终变量。
答案 2 :(得分:1)
基本上,我们使对象在系统中单身是,我们需要确保除了创建的对象外,不会创建其他对象。将单例对象作为安全漏洞,资源挂起问题等可能有很多原因。但是,仍然没有这样的方法,这仅仅是做这种事情的正确方法。但是使用Spring MVC有其自身的优势,我们不需要管理实例,因为它已经由spring处理。例如,涉及服务时,您可能需要将一些配置加载到服务中才能运行。通过使用Spring MVC bean,可以在运行时更改您的配置而无需重新部署。
@Service
@RefreshScope
@EnableConfigurationProperties(UserManagementConfig.class)
public class UserManagementService
{
此UserManagementService是spring服务,它将是spring上下文中的单例bean,其配置通过UserManagementConfig类加载。 这样,您便拥有了我上面提到的优势。 因此,如果您创建静态实例,则无法执行此操作。所以我的建议是最好使用Spring MVC。
答案 3 :(得分:1)
我应该为整个应用程序使用静态服务变量还是将服务作为单例使用
这取决于。您必须问自己两个问题才能得出答案:
static variable
存储在哪里?您有2个选项:
final class Services
,将所有可用服务作为public static final
变量。public static final
变量INSTANCE
您看到第一点将所有类都放在同一位置。可能会变得集群化,难以理解并且很难维护。
第二点,您几乎接近单例情况。
您再次有2个选项:
public static final
变量并直接创建一个实例。第一点是它有好处。如果您需要分配资源或需要执行任何其他“繁重的”操作。这有效,并且是线程安全的
对于第二点,您会看到这就像第一个问题的第二点。
如前所述,这取决于用例。我可能总是会使用单例。因为这样所有关于状态和可用性的逻辑都被放在一个地方。