¿Por qué Spring AOP no está tejiendo frascos externos en tiempo de ejecución?

Tengo una aplicación Java construida sobre Spring 3. Este proyecto tiene otra jarra como dependencia.

sta dependencia contiene una@org.aspectj.lang.annotation.Aspect clase (digamos,com.aspectprovider.aspects.MyAspect). Hay una@Before consejos para tejer un método de clases que implemente la interfazFoo. Algo como

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

LosFoo interface puede estar dentro del "proyecto" o en otro jar. No importa para este ejemplo.

Mi proyecto contiene clases que implementanFoo. Esas son las clases que quiero tejer, por supuesto.

Mi archivo de configuración de contexto de aplicación Spring applicationContext.xml) contiene la línea:

<aop:aspectj-autoproxy />

También declaro el aspecto como un bean e inyecto algunas propiedades:

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

A través del registro puedo ver queMyAspect se instancia y las propiedades se inyectan. Pero el método guardar no se intercepta. Este es el problema

Si copio las clases de aspecto del jar a la aplicación que tiene Spring, funciona. Cuando esos aspectos están contenidos en frascos externos, el método guardar no se intercepta. ¿Alguna pista

edit: cómo llamo al método de guardar de Foo:

//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
}

Básicamente, miapplicationContext.xml tiene las siguientes líneas:

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

No creo que necesite poner algo como

<context:component-scan  base-package="com.project">
    <context:include-filter type="aspectj" expression="com.aspectprovider.aspects.*" />
</context:component-scan>

Respuestas a la pregunta(6)

Su respuesta a la pregunta