2010-02-05 7 views
7

Ho un'applicazione sviluppata su Spring Framework che utilizza un file di proprietà esterno per alcune cose come la stringa host del database, il nome utente e la password in modo da poter controllare il file di configurazione nel nostro repository (è open source) e non compromettere la sicurezza di il db. Inoltre, è ottimo perché gli sviluppatori possono conservare la propria copia di questo file e l'applicazione utilizzerà automaticamente la configurazione sul proprio sistema piuttosto che dover riconfigurare manualmente.È possibile specificare un nome di classe per Spring Framework in un file esterno?

Vorrei poter specificare un bean nello stesso modo. Stiamo lavorando con alcune classi che potrebbero cambiare da sviluppatore a sviluppatore e sarebbe bello se potessimo consentire loro di specificare queste informazioni in un file diverso in modo che non debbano fare confusione con il file di configurazione principale.

Per dare un'idea, abbiamo qualcosa di simile

<property name="url"> 
    <value>${db.host}</value> 
</property> 

casi in cui è specificato db.host in un altro file. Quello che vogliamo è qualcosa di simile

<bean name="ourBean" class="${class.weneed}" /> 

La sintassi di cui sopra in realtà non funziona, ma che dimostra quello che vogliamo fare.

Grazie in anticipo!

Chris

risposta

7

È possibile utilizzare un FactoryBean per questo. Questo esempio è una FactoryBean che sfrutta la capacità di Spring di lanciare un nomeclasse a un oggetto Class l'iniezione di proprietà:

public class MyFactoryBean extends AbstractFactoryBean { 

    private Class targetClass; 

    public void setTargetClass(Class targetClass) { 
     this.targetClass = targetClass; 
    } 

    @Override 
    protected Object createInstance() throws Exception { 
     return targetClass.newInstance(); 
    } 

    @Override 
    public Class getObjectType() { 
     return targetClass; 
    } 

} 

E poi:

<bean name="ourBean" class="com.xyz.MyFactoryBean"> 
    <property name="targetClass" value="${class.weneed}"/> 
</bean> 

Il contesto Spring avranno ora un fagiolo chiamato ourBean che è un oggetto di tipo ${class.weneed}

+1

Impressionante, questo è esattamente ciò che "weneed";) Darei un'occhiata al più presto e tornare da te. Grazie! –

0

un'altra opzione potrebbe essere quella di utilizzare cocoon-spring-configurator, che fa parte del framework Cocoon, ma può essere utilizzato da solo senza dipende da qualsiasi altra roba da bozzolo.
lo usiamo per molte delle nostre applicazioni web. l'idea generale è configurare il bean factory basato su un metodo running.
consente di sostituire/sovrascrivere facilmente le proprietà, ma anche di ignorare le defizioni bean complete.
un caso di utilizzo comune è definire i bean utilizzati dall'applicazione e quindi disporre di alcuni file di configurazione aggiuntivi (che non vengono mai controllati nel controllo del codice sorgente), per sovrascrivere alcuni bean per deridere alcune parti dell'applicazione.

0

ho scoperto che fagiolo creato attraverso la riflessione non è corretta la primavera di fagioli (non registrati in un contesto primavera e immobili inizializzate), ecco miglioramento minore:

@Override 
protected Object createInstance() throws Exception { 
    AutowireCapableBeabFactory beanFactory = (AutowireCapableBeabFactory) getBeanFactory(); 
    return beanFactory.createBean(this.targetClass); 
} 
Problemi correlati