Ressort de Fil d'une Classe Statique
Je fais face à un héritage de la base de code où une classe qui n'est pas câblé jusqu'au printemps doit obtenir une classe qui est câblé jusqu'au printemps. J'espérais pour créer une usine de classe qui a été branché au démarrage et ensuite seulement je pouvais appeler la méthode getInstance() pour obtenir un filaire haut de l'objet. Quelle est la meilleure façon d'aller à ce sujet?
Exemple:
public class LegacyA {
public void doSomething() {
...
Foo foo = FooFactory.getInstance();
...
}
}
public class FooFactory {
private static Foo foo;
public static Foo getInstance() {
if (foo == null) throw new IllegalStateException();
return foo;
}
}
J'ai besoin de FooFactory pour être branché au démarrage de sorte que LegacyA pouvez simplement appeler getInstance() pour qu'elle renvoie une instance de Foo (qui est aussi un bean défini dans le contexte de l'application).
<bean id="legacyA" class="LegacyA"/>
<bean id="foo" class="Foo"/>
<!-- I need this bean to be injected with foo so that the FooFactory can return a foo -->
<bean id="fooFactory" class="FooFactory"/>
Edit: j'ai eu à re-travailler mon exemple un peu comme je l'ai eu un peu confuzzled dans ma tête...
OriginalL'auteur digiarnie | 2009-07-28
Vous devez vous connecter pour publier un commentaire.
À l'aide de la statique, comme ce que cela va à l'encontre de Printemps du Cio, mais si vous avez vraiment ont de les utiliser, alors je suggère d'écrire un simple mousqueton qui prend la
Foo
et l'injecte dans leFooFactory
, par exempleEt dans votre XML:
Pas besoin de modifier
Foo
ouFooFactory
Pourquoi ne pas simplement laisser printemps gérer FooFactory directement. Vous n'avez pas vraiment besoin de l'abstraction de l'est "FooFactoryProcessor". Vous pouvez ajouter un non statique de la propriété setter pour FooFactory à l'ensemble de foo sur elle.
C'est vrai, oui, mais j'allais le long des lignes du plus petit nombre de modifications du code legacy, qui est ce que l'OP a semblé être après.
OriginalL'auteur skaffman
Est la définition du bean comme un singleton dans le Ressort de la configuration de l'utiliser ici ? Vous pouvez ensuite l'injecter dans
LegacyB
l'aide de la propriété ou d'un constructeur injecter (ma préférence est le dernier) et ensuite seulement l'une seule instance est disponible.EDIT: Ré. la modification de votre question (!) Je ne sais pas pourquoi vous n'avez pas simplement injecter Foo nouveau comme un singleton dans votre usine. Notez également que vous pouvez utiliser le
getInstance()
méthode par le biais du Printemps configs en utilisant l'usine de la méthode, et de maintenir l'injection à travers toutes les classes.Merci pour le heads up. Ce n'est pas un problème. Réponse modifiée de façon appropriée.
OriginalL'auteur Brian Agnew
En plus de skaffman la réponse vous devez être très très prudent quant à l'ordre d'initialisation.
Lors de l'utilisation de beans Spring seulement le cadre automatiquement de trouver le bon ordre de l'initialisation de trucs. Dès que vous faites singleton astuces toutefois, cela peut se briser si vous ne faites pas attention.
En d'autres termes assurez-vous que LegacyA ne peut pas être exécuté avant le contexte de l'application des finitions de chargement.
OriginalL'auteur Gregory Mostizky