2011-10-25 15 views
7

La seguente situazione:Contesto molla di carico in un'applicazione basata su EJB

Ho un livello aziendale, ovvero un progetto EJB. Di fatto, esiste solo un EJB creato. Questo bean è responsabile dell'esposizione delle classi di servizio ad altri livelli, che chiamano il bean. Voglio introdurre la molla (per usare la funzione DI) in questo livello.

La mia preoccupazione è, qual è il modo migliore per caricare il contesto di primavera in questo livello aziendale, in modo che il contesto di primavera non venga caricato più e più volte, ogni volta che viene richiamato l'EJB?

(In un progetto Web, c'è un vantaggio piuttosto per configurare il contesto primavera in ContextLoaderListener, e viene caricato una volta solo quando viene avviata l'applicazione)

ho pensato di includere primavera nello stesso livello, perché :

  1. Configurare le dipendenze di tutti i DAO e le classi di servizio e iniettarli dove necessario.
  2. Per utilizzare il supporto a molla per l'ibernazione nel livello aziendale.
  3. Test di facilità dell'unità, iniettando le proprietà in classi e simulando la stessa. Non è necessario eseguire gli altri livelli ancora e ancora, per testare i miei metodi/classi di business.
  4. Per essere in grado di utilizzare AOP (Aspect Oriented Programming) per la registrazione e il controllo del livello del metodo.

Gentilmente aiutami a suggerire il modo migliore, per caricare il contesto primaverile in un progetto EJB. Voglio anche sapere se ci sono alternative se riesco a caricare lo stesso sul server dell'app (sto usando un app server per le sfere Web).

Grazie e saluti,

Jitendriya Dash

+0

Non EJB 3.1 dispone di un proprio framework di iniezione di depenency e CDI sarebbe stato integrato meglio? È necessario solo un DI leggero? – Ralph

risposta

0

Marcatura bean stato come Singleton (@Singleton). E memorizzare il contesto di primavera in una variabile in questo bean, dopo che è stata creata una volta, in modo che sia possibile restituire lo stesso contesto più e più volte.

2

La molla deve essere configurata come parte dell'applicazione nel modo normale in cui viene sempre configurata. Quindi è necessario accedere ai bean Spring dal layer EJB. Per l'accesso (adattato from this post), creare un bean Spring come segue:

@Component 
public class SpringApplicationContext implements ApplicationContextAware { 
    private static ApplicationContext CONTEXT; 
    public void setApplicationContext(ApplicationContext context) throws BeansException { 
     CONTEXT = context; 
    } 
    public static Object getBean(String beanName) { 
     return CONTEXT.getBean(beanName); 
    } 
} 

Poi, a chiamare il fagiolo in questione dalla app legacy:

SomeService someService = (SomeService)SpringApplicationContext.getBean("someServiceImpl"); 

Il contesto primavera viene inizializzata una volta, e la vostra Il livello EJB può accedere a piacere.

2

Per EJB3, Spring consiglia di utilizzare EJB3 Injection Interceptor. Fondamentalmente, si specifica il contesto Spring usando uno ContextSingletonBeanFactoryLocator che comporta la creazione del contesto Spring in un beanContextRef.xml nel classpath. Probabilmente come parte del tuo EAR. Lo SpringBeanAutowiringInterceptor inietta il bean nel tuo EJB.

Problemi correlati