2012-03-22 13 views
10

ho una classe denominata Bar con la seguente annotazione: @Configurable(autowire = Autowire.BY_TYPE)primavera autowire e prototipo portata

Su un membro privato Ho la seguente annotazione:

@Autowired(required = true) 
private Foo foo; 

Nella configurazione di primavera ho un fagiolo di classe Foo. Se il bean è definito con scope="prototype" non funziona e ottengo la seguente eccezione:

NoSuchBeanDefinitionException: Nessuna corrispondenza del fagiolo di tipo Foo trovati per dipendenza: previsto con almeno 1 di fagioli che si qualifica come autowire candidato per questo dipendenza

Dopo aver modificato l'ambito del bean iniettato su "singleton", funziona correttamente.

Non è consentito il cablaggio automatico del bean con scope prototipo?

C'è qualche soluzione alternativa (oltre a ottenere il bean manualmente)?

Grazie in anticipo, Avner

+0

Correlato: http://stackoverflow.com/questions/27776672/spring-protype-scope-behaviour/27782040#27782040 –

risposta

9

I seguenti collegamenti forniscono soluzioni alternative per tali scenari:

  1. http://whyjava.wordpress.com/2010/10/30/spring-scoped-proxy-beans-an-alternative-to-method-injection/
  2. http://benkiew.wordpress.com/2012/04/22/spring-2-5-x-create-prototype-instances-from-code/

il primo anello parla aggiungendo Foo:

@Component 
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype") 
class Foo 

che causerà una nuova istanza per ogni chiamata.

+0

È bello quello che hai scritto, ma sarebbe meglio se tu scrivessi che è necessario configurarlo con proxy :) – tomekK

+0

Solo le risposte ai link sono sbagliate, cosa succederà se i collegamenti dati scompaiono? –

-1

Se la portata fagiolo iniettato è 'Singleton', la stessa istanza del bean sarà auto-cablato. Se l'ambito del bean iniettato è 'prototype', verrà creata una nuova istanza come parte del processo di auto-wire.

Quale versione di Spring si sta utilizzando e allegare spring-context.xml per ulteriori dettagli.

+1

Sono consapevole delle differenze tra prototipo e singleton, non capisco perché dovrebbe la portata del bean influisce sul cablaggio automatico. Sto usando la molla 3. –

0

Credo che sia la cosa prototipo/singleton dichiarata nel tuo xml per quel bean è il problema.

Non è consentito il cablaggio automatico del bean con scope prototipo?

Penso che non sia permesso. La logica è se è permessa, quindi ogni volta che usi quella classe, allora ha bisogno di reintegrare quel bean sempre come suo campo. Il che è strano, specialmente se la classe in cui questo bean è attivato come campo è un singleton stesso.

c'è qualche soluzione alternativa (oltre a ottenere il bean manualmente)?

Basta provare a rimuovere l'attributo scope, perché se è di attributo prototype, non verrà recuperato. Se quei bean (servizi e DAO) sono dichiarati nel tuo applicationContext, lascia che sia l'annotazione autowire a prenderlo come singleton dato che i bean di default sono singleton, che dovrebbe essere.

+0

Grazie per la tua risposta, ma la rimozione dell'attributo scope non risolverà il mio codice poiché tutte le istanze di Bar condivideranno la stessa istanza di Foo che non è ciò di cui ho bisogno. In aggiunta, l'istanza di Foo dovrebbe essere istanziata una volta per creazione/iniezione dell'oggetto Bar e non per utilizzo di campo (per quanto mi riguarda). –

+0

Non so se c'è un'alternativa per il tuo disegno specifico, dimmi se c'è. Ma per quanto riguarda il design, i fagioli dovrebbero essere usati in modo non statico, significa fare attenzione nei campi, assicurarsi che i campi utilizzati in quei bean non siano campi globali ma campi dei metodi, in questo modo anche il suo è singleton, hai vinto Non preoccuparti se è condiviso da molte classi poiché nessuna variabile globale è condivisa, perché è Stateless. – vine

-2

oppure puoi semplicemente utilizzare il nuovo operatore.

+1

Ciò vanifica completamente l'intero scopo di DI e IOC. – csmckelvey

Problemi correlati