8
votes

ApplicationContext.GetBean (Classe Clazz) ne va pas bien avec les proxies

J'ai une définition de haricot au printemps et c'est une contrepartie proxy qui est destinée à être utilisée partout: xxx pré>

Tout cela fonctionne bien; et dans le monde du V3 pré-printemps, je l'utilisais comme p> xxx pré>

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: 


2 commentaires

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.


4 Réponses :


1
votes

ne pouvez-vous pas faire my.interface foo = ctx.getbean (my.bean.class); ?


0 commentaires

2
votes

On dirait que la portée des procurations créées par proxyfactorybean code> doit être spécifiée à l'aide de la propriété singleton code> au lieu de Scope code> Attribut: xxx

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>

my.Interface foo = ctx.getBean("my.Bean", my.Interface.class); 


3 commentaires

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) ? Pouvez-vous s'il vous plaît expliquer?


C'est un nom du haricot demandé dans le contexte de l'application. Il correspond à ID ou nom dans la configuration XML.



7
votes

Le problème ici est le étendue = "prototype" sur votre proxyfactorybean .

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.

Dans le cas de proxyfactorybean , 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 ne peut signaler que le type cible comme null .

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 xxx

, puis: xxx

ici, nous utilisons La convention des noms de haricots étant l'interface qu'ils implémentent.


0 commentaires

0
votes

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);


0 commentaires