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

Java 在基于EJB的应用程序中加载spring上下文,java,spring,jakarta-ee,ejb,spring-remoting,Java,Spring,Jakarta Ee,Ejb,Spring Remoting,情况如下: 我有一个业务层,这是一个EJB项目。实际上,只创建了一个EJB。此EJB负责将服务类公开给调用EJB的其他层。我想在这一层中介绍spring(使用DI特性) 我关心的是,在这个业务层中加载spring上下文的最佳方式是什么,这样无论何时调用EJB,spring上下文都不会被一次又一次地加载 (在Web项目中,在contextLoaderListener中配置spring上下文有一个优势,并且只有在应用程序启动时才会加载一次) 我曾考虑将spring包含在同一层中,因为: 配置所有DA

情况如下:

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

我关心的是,在这个业务层中加载spring上下文的最佳方式是什么,这样无论何时调用EJB,spring上下文都不会被一次又一次地加载

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

我曾考虑将spring包含在同一层中,因为:

  • 配置所有DAO和服务类的依赖项,并在必要时注入它们
  • 在业务层中使用spring对hibernate的支持
  • 通过向类中注入属性并模拟这些属性,简化了单元测试。不需要一次又一次地运行其他层来测试我的业务类/方法
  • 能够使用AOP(面向方面编程)进行日志记录和方法级审计
  • 请帮助我建议最好的方法,在EJB项目中加载spring上下文。我还想知道,如果我可以在app server中加载相同的应用程序(我使用的是Web sphere app server),是否还有其他选择

    感谢和问候


    Jitendriya破折号

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

    spring应该按照通常设置的方式配置为应用程序的一部分。然后您需要从EJB层访问Springbean。要访问(调整),请按如下方式创建Springbean:

    @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层可以随意访问。

    对于EJB3,Spring建议使用。基本上,您可以使用指定Spring上下文,这需要在类路径中的beanContextRef.xml中创建Spring上下文。可能是你耳朵的一部分。SpringBeanAutowiringInterceptor将您的bean注入EJB。

    EJB3.1不是有自己的依赖注入框架吗,如果您只需要一个轻量级DI,CDI会更好地集成吗?