以下是这种情况:
我有一个业务层,即EJB项目。实际上,只创建了一个EJB。此EJB负责将服务类公开给调用EJB的其他层。我想在这一层介绍spring(使用DI功能)。
我担心的是,在此业务层中加载spring上下文的最佳方法是什么,以便在调用EJB时不会一次又一次地加载spring上下文?
(在Web项目中,有一个优点是在contextLoaderListener中配置spring上下文,并且仅在应用程序启动时才加载一次)
我想过将spring包含在同一层中,因为:
请帮助我建议最好的方法,在EJB项目中加载spring上下文。我也想知道,如果有任何替代方案,我可以在应用服务器中加载相同的内容(我正在使用Web领域应用服务器)。
谢谢和问候,
Jitendriya Dash
答案 0 :(得分:3)
Spring应该以您始终设置的常规方式配置为应用程序的一部分。然后,您需要从EJB层访问Spring bean。要访问(改编from this post),请按如下方式创建一个Spring bean:
@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);
}
}
然后,从遗留应用程序中调用有问题的bean:
SomeService someService = (SomeService)SpringApplicationContext.getBean("someServiceImpl");
Spring上下文初始化一次,您的EJB层可以随意访问。
答案 1 :(得分:2)
对于EJB3,Spring建议使用EJB3 Injection Interceptor。基本上,您使用ContextSingletonBeanFactoryLocator指定Spring上下文,这需要在类路径的beanContextRef.xml中创建Spring上下文。可能是您EAR的一部分。 SpringBeanAutowiringInterceptor将您的bean注入您的EJB。
答案 2 :(得分:0)
将EJB标记为单例(@Singleton
)。并在创建一次后将spring上下文存储在此bean的变量中,以便您可以反复返回相同的上下文。