J'ai une définition de haricot au printemps et c'est une contrepartie proxy qui est destinée à être utilisée partout: Tout cela fonctionne bien; et dans le monde du V3 pré-printemps, je l'utilisais comme p> au printemps 3, il est devenu possible de faire des recherches sécurisées de type, par exemple: p> org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [my.Interface] is defined: expected single bean but found 0:
4 Réponses :
ne pouvez-vous pas faire my.interface foo = ctx.getbean (my.bean.class); code>? p>
On dirait que la portée des procurations créées par Ceci a résolu le problème lorsque le haricot cible est intérieur. p> Lorsque vous avez plusieurs haricots de niveau supérieur de la même classe, vous pouvez utiliser une recherche de type-sécurité par ID: P> proxyfactorybean code> doit être spécifiée à l'aide de la propriété
singleton code> au lieu de
Scope code> Attribut:
my.Interface foo = ctx.getBean("my.Bean", my.Interface.class);
J'ai accepté cette réponse trop rapidement. Il s'avère que Singleton = fausse propriété n'est pas la même chose que la portée = prototype. J'ai réussi à obtenir des haricots singletons qui sont enveloppés dans des procurations cibles, même si Singleton = Faux a été spécifié. La réponse de Skaffman est en fait plus proche de la vérité.
Quel est l'argument de chaîne dans ce getbean (chaîne, classe) code>? Pouvez-vous s'il vous plaît expliquer?
C'est un nom du haricot demandé dans le contexte de l'application. Il correspond à ID code> ou
nom code> dans la configuration XML.
Le problème ici est le Le contexte n'initialisera que des définitions de haricot singleton singleton. Les haricots de la portée non singleton sont uniquement initialisés lorsqu'il est demandé. Cela signifie que lorsque vous demandez au contexte des haricots d'un type donné, le contexte ne peut pas initialiser ces haricots non singleton afin de leur demander leur type, il doit aller uniquement sur les informations de la définition des haricots. P> Dans le cas de Je ne peux pas dire un moyen autour de cela, autrement que d'utiliser un singleton définition des haricots, ou demandant explicitement le haricon par nom, par exemple p> , puis: p> ici, nous utilisons La convention des noms de haricots étant l'interface qu'ils implémentent. p> p> étendue = "prototype" code> sur votre
proxyfactorybean code>.
proxyfactorybean code>, le type du proxy généré est déterminé par une logique complexe qui nécessite que le haricon soit complètement initialisé. Sans cette initialisation,
proxyfactorybean code> ne peut signaler que le type cible comme
null code>. P>
Comme le ressort fonctionne avec des interfaces, dans le contexte de l'AOP, vous pouvez définir différents ensemble d'interfaces et demander celui que vous attendez. De cette façon, aucun casting ne sera nécessaire pour une classe réelle mais le printemps gérera des interfaces.
Disons que vous avez des implements de classe A B. Vous voulez lancer A à B, mais elle est refusée comme une proxy due à l'AOP. Ensuite, faire des implements C et C étend B. C possédant les méthodes nécessaires et C est une interface privée accessible uniquement à partir de votre code de mise en œuvre. Demandez enfin le ressort d'injecter soit B OU B ou C en fonction de vos attentes. P>
PrivateItf executor = context.getBean(PrivateItf.class);
Avez-vous vraiment besoin d'interagir avec le contexte directement? La plupart de mes applications ne doivent jamais avoir besoin de bootstrap, puis tout le reste est traité avec une injection de dépendance (qui fonctionne pour des haricots proxés). J'ai fait des trucs de cadre où j'ai besoin d'accéder au contexte, mais de mon expérience, c'était rare.
Notre système est assez large et que certains bits et classes ne sont pas nés au printemps (ni peuvent être), ils doivent donc utiliser BeansFactory / AppCTX pour obtenir les dépendances nécessaires.