2009-09-11 3 views
0

Je suis intéressé à faire passer le cours par procuration au printemps, plutôt que par procuration.Récupérer l'instance mandatée du printemps

-à-dire:

public class FooImpl<KittyKat> { 

    @Transactional 
    public void doStuff() { 
     getBar(); 
     // java.lang.ClassCastException: $Proxy26 cannot be cast to 
     // com.my.foo.Bar 
    } 

} 

public abstract class AbstractFoo<T extends AbstractBar> { 

    public String barBeanName; 

    protected T getBar() { 
     // java.lang.ClassCastException: $Proxy26 cannot be cast to 
     // com.my.foo.Bar 
    return (T)appContext.getBean(barBeanName); 
    } 
} 

public class KittyCat extends AbstractBar { 
... 
} 

public abstract class AbstractBar { 
    ... 
} 
+0

umm, je ne sais pas pourquoi le générique-ness de mon exemple est parti et apparemment ne peut pas l'éditer .. –

+0

là vous allez, fixe – skaffman

+0

Pourquoi ne pas vous nous montrer la configuration de printemps? Nous n'avons aucune idée de comment le nomBeanBeanName est créé. L'utilisation de ApplicationContext.getBean() est une mauvaise odeur dans le code - les dépendances doivent être effectuées via l'injection. – SteveD

Répondre

1

Êtes-vous essayer d'obtenir le seul haricot approximé à cause de la ClassCastException? Si vous pouviez lancer à Bar, seriez-vous heureux avec ça? Lorsque Spring crée un proxy, il vérifie si la classe du bean implémente des interfaces. Si c'est le cas, le proxy généré implémentera également ces interfaces, mais il n'élargira pas la classe du bean cible. Il le fait en utilisant un standard java.lang.reflect.Proxy. Cela semble être le cas dans votre exemple.

Si la classe du bean cible n'implémente aucune interface, Spring utilisera CGLIB pour générer une classe proxy qui est une sous-classe de la classe du bean cible. C'est en quelque sorte une mesure provisoire pour l'envoi par proxy de beans sans interface.

Vous pouvez forcer Spring à toujours proxy la classe cible, mais la façon dont vous le faites dépend de la façon dont vous avez créé le proxy Bar pour commencer, et vous ne nous l'avez pas dit.

La solution généralement préférée est de se référer à vos beans mandatés par leurs interfaces, et tout fonctionne bien. Si votre classe Bar implémente des interfaces, est-ce que votre Foo ne se réfèrerait pas à cette interface?