2009-09-07 2 views
5

Non riesco a ottenere AspectJ per eseguire il tempo di caricamento tessendo su una classe annotata con @configurable nel mio progetto principale. Nessun campo viene impostato e nessuno dei setter viene toccato.Tempo di caricamento della molla che non rileva la classe annotata con @configurable

Non penso ci siano problemi con la configurazione stessa, perché ho estratto la configurazione e l'ho testata su un progetto sandbox più piccolo. Solo per il gusto di farlo, lo includerò comunque in questa domanda.

Quindi, mi chiedo:

  1. C'è qualcosa nel progetto più ampio che potrebbe essere ostacolare Primavera/AspectJ di rilevare la classe di questo particolare?
  2. Esiste un modo per verificare se la molla è a conoscenza della classe nelle domande?

E, infine, qualsiasi codice posso estrarre (scusate l'offuscamento):

Da XML di configurazione:

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

E la classe stessa:

@Configurable 
public class ClassToBeWeaved { 
    private InjectedBean injectedBean; 

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

Edit :

Bene, si scopre che non funzionava a causa di una dipendenza circolare. Oh caro, mi piace lavorare sul codice legacy. Tuttavia, le mie domande originali rimangono.

+0

che ambiente stai eseguendo questa? LTW funziona solo su determinati server delle app. – skaffman

+0

Ho eseguito la mia sandbox proprio in eclissi e l'app corretta è in una WAR in esecuzione su JBoss – mikek

+0

Quale versione di JBoss è in esecuzione e qual è la riga di comando di avvio di Java per esso? Se JBoss è 5.xo superiore non hai bisogno di un agente specifico (e questa è una differenza con la tua sandbox, dove devi specificare l'agente). –

risposta

0

Probabilmente hai dimenticato di "weave". Aggiungi -javaagent:path/to/aspectjweaver.jar o -javaagent:path/to/spring-agent.jar alla riga di comando.

Inoltre, suggerisco di fornire la dipendenza @Autowire piuttosto che iniettarla esplicitamente.

+0

No, neanche quello. -javaagent: (...)/spring-agent-2.5.6.jar "è sulla mia riga di comando – mikek

0

Credo che l'LTW richieda un META-INF/aop.xml sul classpath. Esso dovrebbe essere simile:

<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 no, non lo richiede Come ho detto, funziona dandy nella mia sandbox – mikek

0

Hai più di file XML 1 primavera? Credo che abbia avuto un problema < aop: aspectj-autoproxy /> non era nel "più genitore" dei miei file XML.

+0

Vedi la mia modifica L'errore era dovuto a una dipendenza circolare nel codice (non mia). – mikek

0

Alcuni suggerimenti per la tua domanda.

per rendere il lavoro di tessitura tempo di caricamento con la primavera, non solo è necessario configurare correttamente il aop.xml ma è necessario anche avere la primavera-instrument.jar & primavera-aspects.jar.

Questi file jar contengono il proprio aop.XML che dichiara aspetti Spring gestire:

  • @Transactional supporto
  • @Configurable supporto
  • JPA sostegno traduzione eccezione
  • @Async annotazione di programmazione di sostegno

Cosa succede in background?

Quando si utilizza AspectJ load-time tessitura, i @Transactional e @Configurable implementazioni non sono più basato su JDK proxy o CGLIB proxy ma reali AspectJ aspetti.

Per abilitare questi aspetti reali, sono necessari i file jar aggiuntivi. Il vaso contiene anche la dichiarazione di questi aspetti nella propria aop.xml

Maggiori dettagli su come integrare primavera con AspectJ here