2009-09-07 4 views
5

J'ai du mal à faire en sorte qu'AspectJ effectue du tissage de temps de chargement sur une classe annotée avec @configurable dans mon projet principal. Aucun champ n'est défini et aucun des setters n'est touché.Temps de chargement du ressort ne détectant pas la classe annotée avec @configurable

Je ne pense pas qu'il y ait des problèmes avec la configuration elle-même, car j'ai extrait la configuration et l'ai testée sur un projet de bac à sable plus petit. Juste pour le plaisir, je vais l'inclure dans cette question si.

Alors, je me demande:

  1. Y at-il dans le projet plus vaste qui pourrait être entravait printemps/AspectJ de détection de la cette classe?
  2. Y a-t-il un moyen de vérifier si le printemps est au courant de la classe en question?

Et enfin, quel que soit le code que je peux extraire (s'il vous plaît excuser l'obscurcissement):

De XML de configuration:

<context:annotation-config /> 
<context:spring-configured /> 
<context:component-scan base-package="se.isydev" /> 
<context:component-scan base-package="se.istools" /> 
<aop:aspectj-autoproxy /> 
<context:load-time-weaver aspectj-weaving="on" /> 
<context:property-placeholder location="classpath:settings.properties" /> 
(...) 
<bean class="com.company.ClassToBeWeaved" 
    scope="prototype">  
    <property name="injectedBean" ref="injectedBean" /> 
</bean> 

Et la classe elle-même:

@Configurable 
public class ClassToBeWeaved { 
    private InjectedBean injectedBean; 

    @Required 
    public void setInjectedBean() { ... } 
} 

Modifier :

Eh bien, il s'avère que cela ne fonctionnait pas en raison d'une dépendance circulaire. Oh mon cher, j'aime travailler sur le code hérité. Pourtant, mes questions initiales restent.

+0

Quel environnement vous utilisez celui-ci? LTW ne fonctionne que sur certains serveurs d'applications. – skaffman

+0

J'ai couru mon bac à sable juste en éclipse et l'application appropriée est dans un WAR fonctionnant sur JBoss – mikek

+0

Quelle version de JBoss exécutez-vous et quelle est la ligne de commande de démarrage java pour cela? Si JBoss est 5.x ou supérieur, vous n'avez pas besoin d'un agent spécifique (et cela diffère de votre sandbox, où vous devez spécifier l'agent). –

Répondre

0

Vous avez peut-être oublié de "weave". Ajouter -javaagent:path/to/aspectjweaver.jar ou -javaagent:path/to/spring-agent.jar à votre ligne de commande.

Je suggère également que vous @Autowire votre dépendance plutôt que de l'injecter explicitement.

+0

Non, pas ça non plus. -javaagent: (...)/spring-agent-2.5.6.jar "est sur ma ligne de commande – mikek

0

Je crois que le LTW nécessite un META-INF/aop.xml sur votre chemin de classe. Il devrait ressembler à:

<aspectj> 
    <!-- 
     Uncomment this is you need AOP logging <weaver options="-verbose 
     -showWeaveInfo 
     -XmessageHandlerClass:org.springframework.aop.aspectj.AspectJWeaverMessageHandler"> 
    --> 
    <weaver> 
     <include within="com.xxx.MyClass" /> 
    </weaver> 
    <aspects> 
     <aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/> 
     <include within="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/> 
    </aspects> 
</aspectj> 
+0

Ah non, ça ne l'exige pas, comme je l'ai dit, ça marche dandy dans mon bac à sable – mikek

0

Avez-vous plus de 1 fichier XML de printemps? Je crois que j'ai eu un problème < aop: aspectj-autoproxy /> n'était pas dans le 'parent le plus' de mes fichiers XML.

+0

Voir mon édition L'erreur était due à une dépendance circulaire dans le code (pas à moi). – mikek

0

Quelques conseils pour votre question.

pour faire du travail de tissage de temps de chargement avec le printemps, non seulement vous devez configurer correctement le aop.xml mais vous devez également avoir le ressort instrument.jar & printemps-aspects.jar. Ces fichiers jar contiennent leurs propres fichiers .xml qui déclarent les aspects de printemps gérer:

  • @Transactional soutien
  • @Configurable soutien
  • soutien JPA de traduction d'exception
  • @Async annotation pour le soutien de la planification

Que se passe-t-il en arrière-plan?

Lorsque vous utilisez le tissage de charge en temps AspectJ, les @Transactional et implémentations @Configurable ne sont plus basés sur procurations ou JDK procurations CGLIB mais réels aspects AspectJ .

Pour activer ces aspects réels, vous avez besoin des fichiers jar supplémentaires. Le pot contient aussi la déclaration de ces aspects dans leur propre aop.xml

Plus de détails sur la façon d'intégrer Spring avec AspectJ here

Questions connexes