2016-04-23 23 views
5

Stavo pensando all'inizializzazione pigra dei fagioli in primavera. Per me, non è stato chiarissimo che il "pigro" qui significa che un bean verrà creato quando viene referenziato.Inizializzazione bean bean Spring

Mi aspettavo che il supporto di inizializzazione pigro in primavera sia diverso. Ho pensato che si trattasse di una creazione pigra basata sul "metodo-chiamata". Ciò che intendo è che, ogni volta che viene chiamato un metodo, il metodo verrà creato.

Penso che questo possa essere facilmente risolto creando un'istanza proxy del bean specifico e eseguendo l'inizializzazione su qualsiasi chiamata di metodo.

Mi manca qualcosa perché questo non è implementato? C'è qualche problema con questo concetto?

Qualsiasi feedback/idea/risposta sarà apprezzato.

Grazie ragazzi!

risposta

3

È possibile ottenere il comportamento desiderato circoscrivendo il bean con uno proxyMode di ScopedProxyMode.TARGET_CLASS (CGLIB) o ScopedProxyMode.INTERFACES (JDK).

Ad esempio

public class StackOverflow { 
    public static void main(String[] args) { 
     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Conf.class); 
     Bar bar = ctx.getBean(Bar.class); 
     System.out.println(bar); 
     System.out.println(bar.foo.toString()); 
    } 
} 

@Configuration 
class Conf { 
    @Bean 
    @Lazy 
    @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) 
    public Foo foo() { 
     System.out.println("heyy"); 
     return new Foo(); 
    } 

    @Bean 
    public Bar bar() { 
     return new Bar(); 
    } 
} 

class Bar { 
    @Autowired 
    public Foo foo; 
} 

class Foo { 
} 

stamperà

[email protected] 
heyy 
[email protected] 

dimostrando che il fagiolo Foo stato inizializzato attraverso la sua @Bean metodo factory solo dopo un metodo è stato richiamato su istanza Foo iniettata dal contesto Spring in il bean Bar.

L'annotazione @Scope può essere utilizzata anche in una dichiarazione di classe.

+0

Sai come rendere pigro-carico di fagioli come questo? "return FactoryProvider(). getFactory()" – Fisk

-1

soffietto è la mia opinione:

tipi di fagioli in primavera Contenitore:

Ci sono due Ambito tipo fagiolo in primavera Container .Uno è Prototype, questo tipo di fagiolo non esiste il concetto lazy-init, perché questi bean verranno istanziati quando i client invocano il getBean() metodo ogni volta. Un altro è Singleton, questi fagioli verrà istanziato volta, questi fagioli possono essere istanziati pigramente (basta istanziare quando sono utilizzati, come @Autowired, refrenced) se si definisce l'uso di fagioli @Lazy oppure lazy-init = true.

Come implementare lazy-init:

Sì, implementazione comune è Modalità Proxy.Uso primavera JDK Dynamic Proxy e Cglib per implementare Proxy, è possibile approfondire la comprensione di questi tecnici.

Spero di aiutarti.