Ho un progetto costituito da due sottoprogetti che sono entrambi progetti Spring e hanno un applicationContext.xml ciascuno.Spring Aspect non eseguito quando definito in altro JAR
Uno è un progetto framework (che termina come un JAR) e uno è l'applicazione effettiva (che finisce come WAR e dipende dal JAR e importa il file applicationContext.xml del JAR nel proprio applicationContext.xml).
Nel progetto quadro, ho definito un aspetto per tutti i metodi pubblici.
@Aspect
@Configurable
public class MyAspect {
@Autowired
private SomeBean mBean;
@Pointcut("execution(public * *(..))")
public void anyPublicMethod() {
}
@Before("anyPublicMethod()")
public void checkAuthorization(JoinPoint pJoinPoint) {
mBean.doSomething();
}
}
E Ho attivato AOP nel applicationContext.xml del quadro (che viene importato dalla applicationContext.xml del progetto di applicazione effettiva).
...
<context:spring-configured />
<context:component-scan base-package="com.mypackage" />
<aop:aspectj-autoproxy/>
...
Durante il test nel progetto quadro, l'aspetto viene eseguito come previsto quando si richiamano metodi pubblici su bean Spring.
Come detto sopra, il progetto quadro è incluso nel progetto dell'applicazione come dipendenza ma l'aspetto non viene eseguito quando si chiamano i metodi di corrispondenza (qualsiasi pubblico) nel progetto dell'applicazione su qualsiasi bean Spring.
Ho anche provato a utilizzare la configurazione XML dell'aspetto. Ciò porta allo stesso comportamento.
Abilitare AOP nel contesto dell'applicazione non ha risolto il problema. – tobiasbayer
Ho anche letto che l'autoproxying della molla si applica solo ai bean con gestione a molla, che non è configurabile. Prova a contrassegnarlo come componente per favore? Rif. - 7.2.2 Dichiarazione di un aspetto http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/aop.html – MikePatel
Penso che tu stia confondendo l'applicazione di un aspetto con la sua definizione qui. La documentazione dice che un aspetto può essere __applied__ solo a un bean Spring. Questo non ha nulla a che fare con la dichiarazione dell'aspetto stesso. Deve funzionare anche usando '' @ Aspect'' (senza '' @ Configurable'' o '' @ Component''). Nel mio esempio, l'aspetto è '' @ Configurable'' oltre al campo '' @ Autowired'' per essere iniettato. – tobiasbayer