Tengo una versión de la aplicación Java en Spring 3. Este proyecto tiene otro jar como dependencia.¿Por qué Spring AOP no está tejiendo tarros externos en tiempo de ejecución?
Esta dependencia contiene una clase @org.aspectj.lang.annotation.Aspect
(digamos, com.aspectprovider.aspects.MyAspect
). Hay un consejo @Before
para tejer un método de clases que implementa la interfaz Foo
. Algo así como:
@Before("execution(* com.project.Foo.save(..))")
La interfaz Foo
puede estar dentro del "proyecto" o en otro frasco. No importa para este ejemplo.
Mi proyecto contiene clases que implementa Foo
. Esas son las clases que quiero que sean tejidas, por supuesto.
Mi solicitud de Primavera archivo de configuración de contexto (applicationContext.xml
) contiene la línea:
<aop:aspectj-autoproxy />
También declaro el aspecto como un bean, e inyectar algunas propiedades:
<bean id="myAspect" class="com.aspectprovider.aspects.MyAspect"
factory-method="aspectOf" >
<property name="someproperty" value="somevalue" />
</bean>
Trough tala puedo ver que MyAspect
se crea una instancia y las propiedades se inyectan. Pero el método de 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 jarras externas, el método de guardar no se intercepta. ¿Alguna pista?
edición: cómo me llamo método save 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, mis applicationContext.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 tengo que poner algo como
<context:component-scan base-package="com.project">
<context:include-filter type="aspectj" expression="com.aspectprovider.aspects.*" />
</context:component-scan>
¿Usted está funcionando bajo un environement J2EE? Weblogic websphere jboss o incluso tomcat? –
es tomcat. pero tengo el mismo problema si corro a través de la consola, cargando el contexto de primavera "a mano". – bluefoot
¿Cómo llamas al método 'save' en cuestión? Si no lo está llamando a través de una referencia de que Spring proporciona su código, * el corte de punto no se llamará *. El error habitual es llamar a través de 'this' (explícita o implícitamente), que es una invocación directa en la instancia envuelta y no en el propio bean. –