Pourquoi le Printemps de l'AOP n'est pas le tissage externe pots au moment de l'exécution?

J'ai une application java de construire sur le Printemps 3. Ce projet a un autre bocal comme une dépendance.

Cette dépendance contient un @org.aspectj.lang.annotation.Aspect classe (disons, com.aspectprovider.aspects.MyAspect). Il y a un @Before conseils afin de tisser une méthode de classes implémentant l'interface Foo. Quelque chose comme:

@Before("execution(* com.project.Foo.save(..))")

La Foo interface peut être à l'intérieur du "projet" ou dans un autre bocal. Il n'a pas d'importance pour cet exemple.

Mon projet contient des classes qui implémente Foo. Ceux sont les classes que je veux qu'il soit tissé, bien sûr.

Mon Printemps contexte de l'application le fichier de configuration (applicationContext.xml) contient la ligne:

<aop:aspectj-autoproxy />

Je déclare également l'aspect comme un haricot, et injecter des propriétés:

<bean id="myAspect" class="com.aspectprovider.aspects.MyAspect"
  factory-method="aspectOf" >
  <property name="someproperty" value="somevalue" />
</bean>

Creux de journalisation je peux voir que MyAspect est instancié et les propriétés sont injectés. Mais la méthode save n'est pas intercepté. C'est le problème.

Si je copie l'aspect des classes à partir du pot de l'application qui a le Printemps, il fonctionne. Lorsque ces aspects sont contenues dans les externes, les pots, la méthode save n'est pas intercepté. Toute indices?

edit: comment j'appelle Foo méthode save:

//in a JSF managed bean
@Inject
private Foo myFoo;  //there's a implementation of Foo in a package that spring is looking at. So it is injected correctly.

public String someAction() {
    myFoo.save("something"); //the @Before advice is only called if the class containing the aspect is not in an external jar
}


//in a class with a main method
void main(String[] ars) {
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    //right after the previous line, I can see in the log that MyAspect is instantiated.
    Foo myFoo = ac.getBean(Foo.class);
    myFoo.save("something"); //the @Before advice is only called if the class containing the aspect is not in an external jar
}

Fondamentalement, ma applicationContext.xml a les lignes suivantes:

<context:annotation-config />
<context:component-scan base-package="com.project" />
<context:component-scan base-package="com.aspectprovider.aspects" />
<aop:aspectj-autoproxy />
<bean id="myAspect" class="com.aspectprovider.aspects.MyAspect" factory-method="aspectOf" >
    <property name="someproperty" value="somevalue" />
</bean>

Je ne pense pas que j'ai besoin de mettre quelque chose comme

<context:component-scan  base-package="com.project">
    <context:include-filter type="aspectj" expression="com.aspectprovider.aspects.*" />
</context:component-scan>
  • Êtes-vous en cours d'exécution en vertu d'un J2EE environnement? Weblogic, websphere, jboss ou même de tomcat?
  • c'est tomcat. mais j'ai le même problème si je passe par la console, le chargement printemps contexte "à la main".
  • Comment faites-vous appel à la save méthode en question? Si vous n'êtes pas en l'appelant par l'intermédiaire d'un renvoi que le Printemps est en fournissant votre code, la coupe transverse (pointcut) ne sera pas appelé. L'habitude erreur est d'appeler via this (explicitement ou implicitement), qui est une invocation directe sur le enveloppés d'instance et non pas sur le bean lui-même.
  • Salut. Oui. Je suis d'appel par le biais d'une référence que le printemps s'offrant à moi. Soit par getBean ou la dépression Printemps contexte d'application web, avec des annotations. Il n'y a pas de nouveau mot-clé dans mon code. Je suis en train de modifier le post et ajouter comment je fais appel. Je suis également à la fixation de l'aspect de l'emballage.
InformationsquelleAutor bluefoot | 2011-05-10