在基于EJB的应用程序中加载spring上下文

das*_*h27 8 java spring ejb java-ee spring-remoting

以下是这种情况:

我有一个业务层,即EJB项目.实际上,只创建了一个EJB.此EJB负责将服务类公开给调用EJB的其他层.我想在这一层介绍spring(使用DI功能).

我关心的是,在这个业务层中加载spring上下文的最佳方法是什么,这样一旦EJB被调用,Spring上下文就不会一次又一次地加载?

(在Web项目中,有一个优点是在contextLoaderListener中配置spring上下文,并且仅在应用程序启动时才加载一次)

我想过将spring包含在同一层中,因为:

  1. 配置所有DAO和服务类的依赖关系,并在必要时将其注入.
  2. 在业务层中使用spring支持进行休眠.
  3. 通过将属性注入类并模拟它们,可以轻松进行单元测试.不需要一次又一次地运行其他层,以测试我的业务类/方法.
  4. 能够使用AOP(面向方面​​编程)进行日志记录和方法级别审计.

请帮助我建议最好的方法,在EJB项目中加载spring上下文.我也想知道,如果有任何替代方案,如果我可以在应用服务器中加载相同的(我正在使用Web领域应用服务器).

感谢致敬,

Jitendriya Dash

atr*_*ain 5

Spring 应该按照您通常设置的常规方式配置为应用程序的一部分。然后您需要从 EJB 层访问 Spring beans。要访问(改编自这篇文章),请创建一个 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,从旧应用程序调用有问题的 bean:

SomeService someService = (SomeService)SpringApplicationContext.getBean("someServiceImpl");
Run Code Online (Sandbox Code Playgroud)

Spring上下文初始化一次,你的EJB层就可以随意访问。


Ral*_*lph 0

将 EJB 标记为单例 ( @Singleton)。创建一次后,将 spring 上下文存储在该 bean 的变量中,以便您可以一次又一次返回相同的上下文。