2012-06-12 12 views
9

Ho due fagioli molla come segue:autowiring nella primavera del fagiolo (@Component) creati con la nuova parola chiave

@Component("A") 
@Scope("prototype") 
public class A extends TimerTask { 

    @Autowired 
    private CampaignDao campaignDao; 
    @Autowired 
    private CampaignManager campManger; 
    A(){ 
     init_A(); 
     } 
    } 

devo fare un nuovo oggetto di A con la nuova parola chiave, a causa di un codice legacy

quando Running -> i bean Spring nella classe A sono nulli, posso creare una nuova istanza del bean spring A e utilizzare ancora autowiring al suo interno?

+1

hai definito '' campaignDao' e campManger' nelle definizioni di fagioli primavera del file? – davioooh

+0

@davioooh: sì – abdelhady

risposta

15

Il componente "A" non viene creato dal contenitore Spring, quindi le dipendenze non vengono iniettate. Tuttavia, se è necessario sostenere alcuni codice legacy (se ho capito dalla tua domanda), è possibile utilizzare @Configurable annotazione e costruire/tempo di compilazione di tessitura:

@Configurable(autowire = Autowire.BY_TYPE) 
public class A extends TimerTask { 
    // (...) 
} 

Poi, Primavera inietterà dipendenze autowired al componente A, no importa se è istanziato dal contenitore stesso, o se è istanziato in qualche codice legacy di new.

Per esempio, per impostare l'accumulo di tempo tessitura con Maven plugin è necessario:

  1. Aggiungere <context:spring-configured/> al contesto di applicazione Primavera
  2. Configura Maven AspectJ plugin:

nei plugin di compilazione sezione:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>aspectj-maven-plugin</artifactId> 
     <version>1.4</version> 
     <configuration> 
     <complianceLevel>1.6</complianceLevel> 
     <encoding>UTF-8</encoding> 
     <aspectLibraries> 
      <aspectLibrary> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aspects</artifactId> 
      </aspectLibrary> 
     </aspectLibraries> 
     <!-- 
      Xlint set to warning alleviate some issues, such as SPR-6819. 
      Please consider it as optional. 
      https://jira.springsource.org/browse/SPR-6819 
     --> 
     <Xlint>warning</Xlint> 
     </configuration> 
     <executions> 
     <execution> 
      <goals> 
      <goal>compile</goal> 
      <goal>test-compile</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

... e il Sezione dipendenze:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aspects</artifactId> 
    <version>3.1.1.RELEASE</version> 
</dependency> 
<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjrt</artifactId> 
    <version>1.6.11</version> 
</dependency> 

consultare di riferimento Primavera per maggiori dettagli: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-atconfigurable

+0

la classe A viene istanziata in altre classi usando la parola chiave new, posso ancora effettuare autowiring in classe A dopo aver creato un nuovo oggetto usando la parola chiave new? – abdelhady

+0

Sì - si prega di dare un'occhiata al capitolo nella documentazione di riferimento Spring che ho postato. È possibile con annotazione @Configurable e compilare/caricare la tessitura del tempo. –

+0

beh, ho creato il bean spring che è stato creato dalla nuova parola chiave '@Configurable (autowire = Autowire.BY_TYPE)' e sta ancora ottenendo lo stesso comportamento, quindi cosa mi manca? e cosa intendi per compilazione/caricamento del tempo di tessitura – abdelhady

2

Poiché si sta creando l'oggetto della classe A utilizzando un nuovo operatore, non si ottengono i campi autowired in quell'oggetto e li si trova nulli. Cerca di prendere il fagiolo dal contenitore primavera.

Spero che questo ti aiuti. Saluti.

+0

Devo creare un nuovo oggetto da A, posso creare un nuovo oggetto da A e ancora in grado di autowire in A – abdelhady

+0

Non è possibile. Invece di quello dovresti dichiarare il tuo bean A come prototipo. In modo che ogni volta che richiedi il suo oggetto ti darà un nuovo oggetto inizializzato con le sue proprietà. E i campi autowired in quell'oggetto funzioneranno per il tuo. :-) –

+0

per favore, leggi la risposta di cui sopra funzionerà con la nuova parola chiave – abdelhady

Problemi correlati