2013-01-14 13 views
7

Ho intenzione di creare diversi contesti Spring con un contesto genitore. Ecco come ho intenzione di creare contesto genitore:Gerarchia dei contesti primaverili

new ClassPathXmlApplicationContext(new String[] {"ApplicationContext/application.xml"}) 

E ogni contesto genitore voglio creare in questo modo:

PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); 
configurer.setProperties(properties); 
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(appContext); 
context.addBeanFactoryPostProcessor(configurer); 
context.setConfigLocation("ApplicationContext/beans.xml"); 
context.refresh(); 

L'idea è quella di avere molteplici contesti bambino con lo stesso gerarchia dei bean in ognuno di essi (DAO, servizi, origine dati, gestore transazioni, ecc.). La ragione per avere diversi contesti è richiesta per avere diverse fonti di dati diverse (una per ogni contesto applicativo in realtà). La struttura del database per ogni origine dati è la stessa. Quindi, ci sono alcune domande.

  1. È sicuro avere una tale gerarchia di contesti? Per esempio se ci sono 30 contesti figli?
  2. E la visibilità del bean di contesto cross child? Ad esempio, ho CustomerService bean dichiarato con @Component annotazione con diverse dipendenze DAO autowired. Spring esegue l'autowiring e altre azioni DI all'interno di un particolare contesto figlio?
  3. Inoltre, cercherò i bean dal contesto secondario utilizzando il seguente metodo: childContext.getBean (CustomerService.class); Ricevo il servizio clienti da questo specifico contesto figlio e non da un altro contesto figlio? Lo so, quel singleton di primavera è un singleton per contesto applicativo ma non è ancora sicuro.

PS. Esiste un altro modo per gestire più origini dati descritte here. Ma questo approccio sembra non essere davvero conveniente nel mio caso.

+0

Ho notato che il tuo caso d'uso è esattamente uguale al mio. –

risposta

11
  • È sicuro avere una tale gerarchia di contesti? Per esempio se ci sono 30 contesti figli?

Cosa intendi per sicurezza? Se intendi la sicurezza dei thread durante l'inizializzazione dei bean, allora sì, poiché i contesti sono inizializzati uno per uno.

  • E la visibilità del bean di contesto cross child? Ad esempio, ho CustomerService bean dichiarato con @Component annotazione con diverse dipendenze DAO autowired. Spring esegue l'autowiring e altre azioni DI all'interno di un particolare contesto figlio?

I bean non sono visibili nei contesti secondari. Gli unici bean visibili in un contesto sono i suoi e quelli nei suoi contesti genitore.

  • Inoltre, ho intenzione di ricercare i fagioli dal contesto bambino utilizzando seguente metodo: childContext.getBean (CustomerService.class); Ricevo il servizio clienti da questo specifico contesto figlio e non da un altro contesto figlio? Lo so, quel singleton di primavera è un singleton per contesto applicativo ma non è ancora sicuro.

Sì. Secondo la risposta all'ultima domanda.

Uso questo modello abbastanza estesamente nelle mie applicazioni. Esiste un contesto comune condiviso da molti altri contesti figlio facendolo diventare il loro genitore. È piuttosto utile quando si desidera eseguire contesti completamente isolati all'interno di una singola JVM, ad esempio se l'applicazione è mutante. Quindi è possibile avviare/arrestare/riavviare i contesti delle applicazioni in modalità tenant senza riavviare la JVM.

Ciò consente anche una chiara separazione delle origini dati e dei gestori delle transazioni e consente di suddividere facilmente i propri database.

+0

Grazie per la risposta. L'architettura multi-tenant è esattamente il mio caso. Non ero sicuro di usare il modello descritto per portare la primavera alla mia applicazione. Con "sicurezza" intendevo che è buona pratica creare molti contesti primaverili. Come hai detto, stai usando questo modello abbastanza estensivamente, quindi sembra essere OK. – alsid

+0

Sto cercando casi di utilizzo del contesto genitore/figlio di Spring. Conoscete altri casi d'uso rispetto all'architettura multi-tenant? Hai modificato la tua soluzione negli ultimi 2 anni? – michaldo