2013-08-27 6 views
1

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.

+1

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

Répondre

0

oui vous pouvez définir votre point coupé comme celui-ci

l'exécution de toute méthode définie dans le paquet bar ou d'un sous-ensemble:

exécution (* com.foo.bar .. . (0) click here for detail

+0

Merci pour votre réponse. Je définis le point de coupe, mais Spring essaie de créer des proxies de classes dans d'autres paquets. J'ai mis à jour la question avec plus de détails. – Dani

+0

Selon l'exception, vous essayez de créer un objet proxy pour la classe finale. pourquoi avez-vous déclaré un contrôleur final? –