Java web应用程序上下文和服务上下文之间的双向依赖关系

Java web应用程序上下文和服务上下文之间的双向依赖关系,java,spring,jakarta-ee,spring-mvc,Java,Spring,Jakarta Ee,Spring Mvc,我有两个spring上下文:“webapplication”上下文和一个“core”上下文。上下文“core”在服务器启动时初始化,并附加到保存上下文的单例类。“webapplication”上下文在webapplication启动时初始化 我想将bean依赖项从一个上下文中的bean注入到另一个上下文中(双向访问)。webapplication bean将是“会话”范围的bean 我正在用:webappbean-->(这取决于)核心bean-->(这取决于另一个)webappbean来测试这个

我有两个spring上下文:“webapplication”上下文和一个“core”上下文。上下文“core”在服务器启动时初始化,并附加到保存上下文的单例类。“webapplication”上下文在webapplication启动时初始化

我想将bean依赖项从一个上下文中的bean注入到另一个上下文中(双向访问)。webapplication bean将是“会话”范围的bean

我正在用:webappbean-->(这取决于)核心bean-->(这取决于另一个)webappbean来测试这个概念验证

在webapplication上下文初始化时,我可以将“核心”bean注入到“webapplication”bean中(一个BeanFactory,它让singleton发挥神奇的作用),但不知道如何做相反的事情;因为保存WebApplicationContext的Spring ThreadLocal尚未初始化

问题是。这是我想做的吗?如果答案是“是”,你会怎么做

谢谢,这是事先准备好的

编辑:


我意识到我做错了什么。事实上,我试图在错误的时间向服务层注入对会话bean的依赖;也就是说,在web初始化时,我没有当前的用户会话。

在我看来,这是一个架构问题,而不是技术问题(当然也不是Spring问题)。核心上下文和web上下文之间的分离非常好。前者处理业务流程,而后者负责表示,可能是一些API

从web(表示、访问)到core的依赖是可以理解的,也是必需的——毕竟您是在业务例程上构建接口。这是默认情况下的工作方式,创建核心上下文的独立子(web)应用程序上下文

我很难想象反向依赖的用例。为什么您的业务逻辑依赖于web层?如果您尝试将您的应用程序迁移到另一种表示技术(桌面、移动),会怎么样?你能证明这种反向依赖的原因吗?会话bean是什么意思


双向依赖关系,以及持有类加载器范围内对应用程序上下文引用的静态单例,应该表明设计有问题。

在我看来,这似乎是一个架构问题,而不是技术问题(当然也不是Spring问题)。核心上下文和web上下文之间的分离非常好。前者处理业务流程,而后者负责表示,可能是一些API

从web(表示、访问)到core的依赖是可以理解的,也是必需的——毕竟您是在业务例程上构建接口。这是默认情况下的工作方式,创建核心上下文的独立子(web)应用程序上下文

我很难想象反向依赖的用例。为什么您的业务逻辑依赖于web层?如果您尝试将您的应用程序迁移到另一种表示技术(桌面、移动),会怎么样?你能证明这种反向依赖的原因吗?会话bean是什么意思


双向依赖关系以及持有类加载器范围内对应用程序上下文引用的静态单例应该表明设计有问题。

我的业务逻辑依赖于会话数据,因为我需要(示例)从服务bean内部访问/处理shooping cart bean(具有会话范围),在发送一些信息到后端层之前。Singleton模式是许多体系结构中的常见做法,我们的Singleton持有ApplicationContext(而不是classloader)。你为什么说这是一个糟糕的设计实践?@andresoviedo:谢谢你的澄清。您的业务逻辑不是从web层调用的吗?如果是这种情况,只需阅读web层中的购物车,并将其作为参数显式传递。关于singleton-在singleton的静态字段中保留对
ApplicationContext
的引用(singleton具有类装入器作用域,这就是我的意思)非常难看,Spring为此提供了更好的机制,例如上下文继承(如Spring MVC所述)。更不用说单身本身有时被称为反模式。谢谢。Mi业务逻辑从web层调用。我已经考虑将web bean作为参数传递给服务层,但我想使用作用域会话bean的注入来简化组件的连接。我的业务逻辑依赖于会话数据,因为我需要(示例)从服务bean内部访问/处理shooping cart bean(具有会话作用域),在发送一些信息到后端层之前。Singleton模式是许多体系结构中的常见做法,我们的Singleton持有ApplicationContext(而不是classloader)。你为什么说这是一个糟糕的设计实践?@andresoviedo:谢谢你的澄清。您的业务逻辑不是从web层调用的吗?如果是这种情况,只需阅读web层中的购物车,并将其作为参数显式传递。关于singleton-在singleton的静态字段中保留对
ApplicationContext
的引用(singleton具有类装入器作用域,这就是我的意思)非常难看,Spring为此提供了更好的机制,例如上下文继承(如Spring MVC所述)。更不用说单身本身有时被称为反模式。谢谢。Mi业务逻辑从web层调用。我已经考虑将WebBean作为一个参数传递给服务层,但是我想使用作用域会话bean的注入来简化组件的连接。