2015-05-11 6 views
7

Sto cercando di individuare l'ambito di un bean con il suo nome.Come determinare la portata di un bean a livello di programmazione

Quello che ho trovato finora è:

BeanFactory#isPrototype(String name) 
      #isSingleton(String name) 

Nel mio caso voglio scoprire se il fagiolo è in richiesta di portata. Ci sono alcuni metodi interni nel framework Spring che potrei usare, ma mi chiedo se esiste un modo "corretto" di farlo.

+0

Questa è solo un'ipotesi, ma dal momento che il normale codice di applicazione non dovrebbe conoscere gli ambiti, è probabile che quei metodi interni siano la tua unica opzione. – biziclop

+0

Non dovrebbe essere necessario scoprirlo in fase di esecuzione. Sei il progettista dell'applicazione. Dovresti *** già sapere. – EJP

+1

@EJP Nel mio caso, nel posto in cui ho bisogno di sapere, non lo so. Se avessi saputo che non avrei chiesto. – Sandro

risposta

4

Buona domanda.

Non esiste alcun metodo isRequst() in BeanFactory perché l'ambito della richiesta è rilevante solo per il Web.

Ho appena cercato di trovare il modo di farlo e ho fallito. Quindi, posso suggerirti un work-around che funzioni se usi le annotazioni. Quando ottieni l'istanza di bean, dire bean.getClass().getAnnotation(Scope.class). Se questo restituisce Scope chiama value().

Questo non è un metodo "scientifico", ma speriamo che sia abbastanza buono per voi.

EDIT

Altro approccio è il seguente. I bean scope di richiesta sono memorizzati nell'attributo di richiesta. Non ricordo il suo nome ora ma puoi trovarlo facilmente da solo, basta esaminare la tua richiesta nel debugger. Quindi controlla che ci sia riferimento al tuo bean. Questo metodo è probabilmente migliore ma richiede alcuni sforzi per indagare l'attributo della richiesta e la struttura dei dati utilizzati dal framework Spring.

1

La seguente soluzione funzionerà per le istanze di ConfigurableApplicationContext:

import org.springframework.beans.factory.config.BeanDefinition; 
import org.springframework.context.ConfigurableApplicationContext; 

public String getScope(ConfigurableApplicationContext context, String sourceBean) { 
    BeanDefinition beanDefinition = context.getBeanFactory().getMergedBeanDefinition(sourceBean); 
    return beanDefinition.getScope(); 
} 

Consultando le BeanDefinition s, questa soluzione funziona anche per scopi di fagioli personalizzato.