2011-10-25 23 views
7

La siguiente es la situación:carga en una aplicación basada EJB

Tengo una capa de negocio, que es un proyecto EJB. De hecho, solo hay un EJB que se crea. Este EJB es responsable de exponer las clases de servicio a otras capas, que llama al EJB. Quiero introducir el resorte (para usar la función DI) en esta capa.

Mi preocupación es, ¿cuál es la mejor manera de cargar el contexto de primavera en esta capa empresarial, para que el contexto de primavera no se cargue una y otra vez, cada vez que se llama al EJB?

(En un proyecto Web, hay una ventaja en lugar de configurar el contexto de primavera en contextLoaderListener, y se carga una sola vez cuando la aplicación se inicia)

he pensado incluyendo la primavera en la misma capa, porque :

  1. Configure las dependencias de todas las clases de servicio y DAO e inícielos cuando sea necesario.
  2. Para usar soporte de resorte para hibernar en la capa de negocios.
  3. Prueba de facilidad de unidad, al inyectar las propiedades en clases y simular lo mismo. No es necesario que ejecute las otras capas una y otra vez para probar mis clases/métodos empresariales.
  4. Para poder usar AOP (Programación Orientada a Aspectos) para el registro y la auditoría de nivel de método.

Amablemente me ayuda a sugerir la mejor manera, para cargar el contexto de primavera en un proyecto EJB. También quiero saber si hay alguna alternativa si puedo cargar lo mismo en el servidor de aplicaciones (estoy usando el servidor de aplicaciones Web).

Gracias y Saludos,

Jitendriya Dash

+0

¿No EJB 3.1 tiene su propio marco de inyección de dependencias, y CDI estaría mejor integrado? ¿Solo necesita un DI liviano? – Ralph

Respuesta

0

Marcado del EJB sido como un Singleton (@Singleton). Y almacenar el contexto de primavera en una variable en este bean, después de que se crea una vez, para que pueda devolver el mismo contexto una y otra vez.

2

El resorte debe configurarse como parte de su aplicación de la manera normal en que siempre lo configuró. Luego necesita acceder a los beans Spring de la capa EJB. Para el acceso (adaptado from this post), crear un grano de primavera de la siguiente manera:

@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); 
    } 
} 

Entonces, para llamar al frijol en cuestión de la aplicación heredadas:

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

El contexto primavera se inicia una vez, y su La capa EJB puede acceder a voluntad.

2

Para EJB3, Spring recomienda utilizar un EJB3 Injection Interceptor. Básicamente, especifique su contexto Spring usando ContextSingletonBeanFactoryLocator que implica la creación de su contexto Spring en beanContextRef.xml en su classpath. Probablemente como parte de su EAR. El SpringBeanAutowiringInterceptor inyecta su bean en su EJB.

Cuestiones relacionadas