Obtenez de l'AOP proxy de l'objet lui-même
Est possible d'obtenir le proxy d'un objet donné au Printemps? J'ai besoin d'appeler une fonction d'une sous-classe. Mais, évidemment, quand je fais un appel direct, les aspects ne sont pas appliquées. Voici un exemple:
public class Parent {
public doSomething() {
Parent proxyOfMe = Spring.getProxyOfMe(this); //(please)
Method method = this.class.getMethod("sayHello");
method.invoke(proxyOfMe);
}
}
public class Child extends Parent {
@Secured("president")
public void sayHello() {
System.out.println("Hello Mr. President");
}
}
J'ai trouvé un moyen d'y parvenir. Cela fonctionne, mais je pense n'est pas très élégant:
public class Parent implements BeanNameAware {
@Autowired private ApplicationContext applicationContext;
private String beanName; //Getter
public doSomething() {
Parent proxyOfMe = applicationContext.getBean(beanName, Parent.class);
Method method = this.class.getMethod("sayHello");
method.invoke(proxyOfMe);
}
}
- Voir aussi Auto injection au printemps
Vous devez vous connecter pour publier un commentaire.
Ce hack est extrêmement maladroit, veuillez tenir compte de la refactorisation de votre code, ou d'utiliser AspectJ tissage. Vous pouvez vous sentir averti, voici la solution
JavaDoc. J'ai blogué à ce sujet ici et ici.
AopContext.currentProxy()
comme suggéré par Tomasz fonctionne. Plus générique de la solution, qui fonctionne en dehors de la classe proxy est de convertir l'objet deorg.springframework.aop.framework.Advised
et obtenir.getTargetSource().getTarget()
L'ancien (l'obtention de l'objet réel de l'objet traité par proxy) est quelque chose que vous ne devriez pas vraiment besoin. D'autre part l'obtention de la cible procuration peut être utile dans certaines classe utilitaire qui inspecte les haricots existants afin d'ajouter certaines fonctionnalités.
Vous pouvez utiliser un bean post-processeur pour définir une référence à la procuration sur la cible bean. Il déplace le Printemps-spécificités de vos haricots à une seule classe.
Post-Processeur
Contexte
Enregistrer le post-processeur dans
applicationContext.xml
.Haricots
Chaque bean doit mettre en œuvre
SelfReferencingBean
à dire le post-processeur qu'il a besoin d'une référence pour le proxy.Maintenant mettre en œuvre
setProxy
dans chaque fève de cacao qui doit s'appeler lui-même par le biais de son mandataire.Vous pourriez mettre le dernier bout de code dans un bean de la classe de base si vous n'avez pas l'esprit de la coulée
proxy
bean de type lors de l'appel de méthodes directement sur elle. Puisque vous allez à traversMethod.invoke
vous n'auriez même pas besoin de la fonte.Avec un peu de travail je parie que ce pourrait être converti à un processeur d'annotation à la
@Autowired
. Venez pour penser à elle, je ne me souviens pas si j'ai même essayé d'ajouter une auto-référence à l'aide de@Autowired
lui-même.