2013-01-04 10 views
5

Utilizzo di Spring 3.1. Se voglio recuperare un bean con scope prototype (cioè voglio una diversa istanza della classe ogni volta), è possibile recuperare il bean senza dover utilizzare una classe ApplicationContextaware?È possibile recuperare un bean Spring con ambito prototipo senza utilizzare ApplicationContextAware

Questo è come lo faccio attualmente

@Component 
@Qualifier("MyService") 
public class MyServiceImpl implements MyService { 

    @Override 
    public void doSomething() { 
     Blah blah = (Blah)ApplicationContextProvider.getContext().getBean("blah"); 
     blah.setThing("thing"); 
     blah.doSomething(); 
    } 
} 


@Component("blah") 
@Scope("prototype") 
public class Blah { 
    .... 
} 

dove ApplicationContextProvider implementa ApplicationContextAware.

È possibile eseguire questa operazione con annotazioni o semplice configurazione di Spring senza dover utilizzare una classe ApplicationContextAware?

risposta

1

Primavera ha alcuni metodi piuttosto sophosticated per realizzare quello che stai dopo ...

Vedere la documentazione di primavera: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-factory-scopes-other-injection

Ricerca di portata primavera proxy Google ha anche vomitato qualche risultato ...

+2

Sì, penso che questo è quello che sto cercando. Questa domanda SO mostra come farlo con le annotazioni: http://stackoverflow.com/questions/4503606/annotation-equivalent-of-aopscoped-proxy – CodeClimber

0

Non hai davvero bisogno di ApplicationContextAware. Hai solo bisogno di un BeanFactory (ApplicationContextAware è solo un modo conveniente per farlo).

Un bean con prototipo di scope significa semplicemente che ogni volta che ApplicationContext.getBean viene chiamato una nuova istanza del bean viene creata. Se provi a iniettare un prototipo di bean in un singleton, il tuo prototipo di bean verrà iniettato una sola volta (e quindi non sarà più un prototipo).

C'è qualcosa chiamato method injection che può essere d'aiuto se veramente necessario, ma è più complesso della semplice chiamata applicationContext.getBean().

+0

Grazie per la risposta. Sto cercando di evitare di scrivere qualsiasi Java specifico di Spring implementando ApplicationContextAware o usando un BeanFactory. – CodeClimber

Problemi correlati