J'essaie d'utiliser AOP dans un projet Spring (grand) existant. Le fait est que je ne veux pas que Spring crée des proxys pour tous les objets dans ApplicationContext, principalement pour les performances mais aussi parce qu'il y a des classes finales que je ne peux pas modifier.Analyser des packages spécifiques pour Spring AOP
J'ai essayé de faire des recherches de printemps seulement à l'intérieur en définissant l'aspect suivant « com.foo.bar *. »:
com.baz.MyAspect
@Aspect
public class MyAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(MyAspect.class);
@Before("within(com.foo.bar.*) && " +
"execution(* com.foo.bar.MyController.handleRequest(..))")
public void getData() {
// Nothing yet
}
}
Et j'ai ajouté ces lignes à la configuration:
<?xml version="1.0" encoding="utf-8"?>
<beans ...>
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="myAspect" class="com.baz.MyAspect"/>
</beans>
Mais quand je lance l'application, je reçois l'exception suivante:
Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.foobar.FinalController]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class com.foobar.FinalController
il semble donc que le printemps est à balayage ning autres que ceux définis dans l'expression within. Je voudrais savoir s'il existe un moyen de spécifier les paquets à analyser ou tout autre moyen de résoudre ce problème.
Je ne sais pas si j'ai compris la question complètement, Spring ne crée pas de proxy pour tout, seulement pour les haricots qui correspondent au pointcut, ainsi vous pouvez indiquer votre pointcut avec le préfixe de paquet et seulement ces haricots devraient obtenir par mandataire. –