Prenons l'exemple le plus simple: vous avez une application et vous utilisez simplement le chargeur de classe par défaut. Vous avez une classe qui, pour une raison quelconque, vous décidez qu'elle ne doit pas avoir plus d'une instance dans l'application. (Pensez à un scénario où plusieurs personnes travaillent sur des pièces de l'application).
Si vous n'utilisez pas le framework Spring, le modèle Singleton garantit qu'il n'y aura pas plus d'une instance d'une classe dans votre application. C'est parce que vous ne pouvez pas instancier des instances de la classe en faisant 'new' car le constructeur est privé. La seule façon d'obtenir une instance de la classe est d'appeler une méthode statique de la classe (généralement appelée «getInstance») qui renvoie toujours la même instance.
Dire que vous utilisez le framework Spring dans votre application signifie simplement qu'en plus des moyens habituels d'obtenir une instance de la classe (méthodes nouvelles ou statiques qui renvoient une instance de la classe), vous pouvez également demander à Spring de vous obtenir une instance de cette classe et Spring garantira que chaque fois que vous lui demanderez une instance de cette classe, elle retournera toujours la même instance, même si vous n'avez pas écrit la classe en utilisant le modèle Singleton. En d'autres termes, même si la classe a un constructeur public, si vous demandez toujours à Spring une instance de cette classe, Spring n'appellera ce constructeur qu'une seule fois pendant la durée de vie de votre application.
Normalement, si vous utilisez Spring, vous ne devez utiliser Spring que pour créer des instances, et vous pouvez avoir un constructeur public pour la classe. Mais si votre constructeur n'est pas privé, vous n'empêchez vraiment personne de créer directement de nouvelles instances de la classe, en contournant Spring.
Si vous voulez vraiment une seule instance de la classe, même si vous utilisez Spring dans votre application et que vous définissez la classe dans Spring comme un singleton, le seul moyen de garantir cela est également d'implémenter la classe à l'aide du modèle Singleton. Cela garantit qu'il y aura une seule instance, que les gens utilisent Spring pour obtenir une instance ou contourner Spring.