2012-12-10 13 views
5

Ho due bean, padre e figlio. Fagiolo secondario dichiarato come ambito Protoype.
Desidero che un nuovo oggetto figlio venga utilizzato per chiamare il metodo di qualsiasi figlio nella classe Parent. Per es. nell'esempio seguente, voglio l'istruzione 1 chiama il metodo sayHi su un altro oggetto figlio e l'istruzione 2 chiama direHi1 su un altro oggetto figlio.Fagiolo contrassegnato con ambito prototipo non funzionante in primavera

Un modo è quello di implementare ApplicationContextAware e ottenere nuovo oggetto figlio utilizzando context.getBean("") prima di chiamare il metodo di qualsiasi figlio. Ma io non voglio farlo.

C'è qualche altra alternativa?

@Component 
public class Parent{ 

    @Autowired 
    Child child; 

    public void sayHello(){  
     child.sayHi();   -------------- (1) 
    } 

    public void sayHello1(){  
     child.sayHi1();   --------------- (2) 
    } 
} 

@Component 
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE) 
public class Child{ 

    public void sayHi(){ 
     System.out.println("Hi Spring 3.0"); 

    } 

    public void sayHi1(){ 
     System.out.println("Hi1 Spring 3.0 ");  
    } 

} 
+0

Se era configurazione XML allora si dovrebbe utilizzare l'approccio di ricerca-metodo, ma che non è ancora disponibile in annotazioni, credo. http://stackoverflow.com/questions/3891997/how-to-do-spring-lookup-method-injection-with-annotations –

risposta

2

io penso che si debba fare una new Child te stesso ogni volta o addirittura utilizzare il contesto primavera per ottenere un fagiolo fresco.

Spring creerà una nuova istanza solo quando è necessario iniettare qualcosa (in caso di prototipo). Quando sei in una classe sei effettivamente fuori dal campo della primavera.

Ecco un post simile: @Scope("prototype") bean scope not creating new bean

http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html#beans-factory-scopes-prototype parti 4.4.2 e 4.4.3 sono rilevanti.

0

Non puoi farlo. Dopo che ApplicationContext è attivo, solo un bean verrà iniettato nel child. Per ogni genitore verrà creato un nuovo figlio.

La cosa è che un genitore ha un solo figlio, quindi i tuoi 2 metodi invocheranno solo quei metodi figlio.

Che cosa stai cercando di ottenere? Sono sicuro che c'è una soluzione adeguata per questo.

10

La correzione è semplicemente per contrassegnare il bean prototipo come proxy ambito, ciò significa che è un quando si inietta un bean di un ambito più piccolo in un ambito più grande (come nel caso in cui un prototipo viene iniettato in un singleton) quindi un proxy del bean verrà iniettato nell'ambito più ampio e quando i metodi del bean vengono richiamati tramite proxy, il proxy capisce l'ambito e risponde in modo appropriato.

@Component 
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE, proxyMode=ScopedProxyMode.TARGET_CLASS) 
public class Child{ 

Ecco un reference

Un'altra opzione potrebbe essere quella di usare qualcosa che si chiama metodo di ricerca di iniezione descritto here

1

Prototype portata significa primavera vi darà una nuova Child oggetto ogni volta che si chiede per un (tramite iniezione o recupero esplicito di bean da un contesto dell'app). Nella tua classe Parent, hai richiesto una sola volta una Child, quindi ne hai ricevuta solo una. Se si desidera che due diversi Child oggetti nel Parent, poi autowire due:

@Component 
public class Parent{ 

    @Autowired 
    Child child; 

    @Autowired 
    Child child1; 

    public void sayHello(){  
     child.sayHi(); 
    } 

    public void sayHello1(){  
     child1.sayHi1(); 
    } 
} 
Problemi correlati