2009-05-29 7 views
3

J'ai configuré Spring-AOP sur un bean.Spring AOP - comment lancer un bean proxy?

Lorsque j'accède à ce bean, il me renvoie une classe proxy de printemps au lieu du bean réel.

Y a-t-il un moyen d'obtenir le bean actuel?

applicationContext.xml

<bean id="abc" class="abc.java" /> 

some.java

abc a = (abc)applicationContext.getBean("abc") 

cela jette:

java.lang.ClassCastException: $Proxy19

+0

pouvez-vous fournir la configuration de printemps de cette fève? – dfa

+0

hakish

+0

Est-ce que 'abc' est une classe concrète ou une interface? – Gandalf

Répondre

3

Vous allez devoir jeter un objet proxy pour démarreurs à coup sûr. Ensuite, essayez:

Proxy.getTargetSource().getTarget 

Je n'ai pas vraiment aucune idée si cela fonctionnera, la documentation AOP est très ambiguë pour décrire les types de retour pour les classes proxy, il dit des choses comme « retours

+3

Thanx man votre solution est partiellement correcte. org.springframework.aop.framework.La classe Advisored fait l'affaire. Conseillé conseillé = (Conseillé) proxy; Target target = proxy.getTargetSource(). GetTarget(); – hakish

+0

Bon à savoir. Heureux de vous aider. – Gandalf

+0

Cependant, ce n'est pas une approche préconisée par les gars du printemps, car elle est envahissante. Les proxys AOP correctement configurés sont transparents pour l'application. Si ce n'est pas le cas, ce n'est pas vraiment AOP. – skaffman

2

Selon la Si le bean cible implémente des interfaces, Spring génèrera un proxy qui étend la classe du bean cible (en poursuivant CGLIB) ou générera un proxy qui implémentera les interfaces du bean cible. alors cette dernière option sera sélectionnée, ce qui est généralement préférable, je devine que votre cible SS met en effet en œuvre au moins une interface. Est-ce que votre code qui obtient le bean jette la référence au type d'interface au lieu de la classe?

Vous pouvez cependant forcer Spring AOP à générer des proxies qui étendent la classe du bean cible, à l'aide de l'option proxy-target-class. La syntaxe exacte dépend de la façon dont vous avez configuré l'AOP, et vous ne le spécifiez pas dans votre question.

+0

je pourrais résoudre mon problème en utilisant la classe org.springframework.aop.frame.Advised. Cela m'a permis d'accéder à la classe cible qui est le bean lui-même. Merci pour vos entrées. – hakish

Questions connexes