为什么 Spring 允许实例化带有 Private 构造函数的 bean?

问题描述

如对 this question 的回答所述,Spring 可以通过反射调用私有构造函数

通常,当我们创建一个带有私有构造函数的类时,我们会使用它来防止类外的实例化(如单例类的情况),或者用于防止使用静态实用方法/常量的类实例化。

Spring 允许实例化具有私有构造函数的 bean 的原因是什么?

解决方法

您必须询问 Spring 开发人员。这可能是为了方便。

  • 它允许您创建无法实例化的类,除非通过 Spring Container 或其他基于反射的技术。

  • 它允许您要求 Java 代码使用需要不同输入的其他构造函数。

如果 Spring 无法使用私有或包访问构造函数,那么您将不得不声明具有公共访问权限的构造函数。然后您的 Java 代码可以使用它们。您不以这种方式使用类的意图不会那么明确。

,

当我们创建一个带有私有构造函数的类时,我们将它用于 防止在类之外实例化 单例类,或用于防止类的实例化 静态实用方法/常量

Spring 不会违反您拥有的私有方法或构造函数来处理您不想做的事情。如果你打算让你的类成为一个 spring bean,那么这个 bean 将由 spring 它自己创建并处理回给你。实际上,它会实例化另一个具有您的类的功能的代理类。

但是如果它是一个 spring bean,那么你可以肯定,如果你想要一个单例,spring 只会处理你一个单例。如果你想要一个原型,那么 spring 只会处理你一个原型。 Spring 将负责该对象的生命周期,您可以指示 spring 在该生命周期中做什么。那些关于它应该如何处理对象生命周期的指示在今天通过注释发生了。

那么,如果您要求 Spring 处理您的原型对象,为什么还要关心您是否只有私有构造函数呢?它关心你指示 Spring 做什么。没有侧面提示。