使用 Spring 注入运行时依赖性

2022-09-04 02:33:19

我目前的项目是利用Spring,我们的架构师决定让Spring管理服务,存储库和工厂对象,而不是域对象。我们密切关注领域驱动设计。不对域对象使用 spring 的原因主要是 spring 只允许静态依赖注入。静态依赖注入的意思是,依赖关系是在xml配置中指定的,它们被“冻结”。

我可能错了,但我目前的理解是,即使我的领域只利用接口与对象通信,但spring的xml配置迫使我指定具体的依赖关系。因此,所有具体的依赖关系都必须在部署时解决。有时,这是不可行的。我们的大多数用例都基于基于运行时数据或从最终用户接收的消息注入特定类型。

我们的大部分设计都遵循命令模式。因此,当我们收到命令时,我们希望构造我们的域模型,并根据从命令接收的数据,我们将特定的类型集注入到我们的聚合根对象中。因此,由于缺乏spring基于运行时数据构建域模型的能力,我们被迫使用静态工厂方法,构建器和工厂模式。

有人可以建议如果春天有问题到上述情况吗?

我可以使用AOP来注入依赖关系,但我没有利用spring的基础设施。


答案 1

我建议你阅读Spring文档中关于使用AspectJ依赖注入Spring域对象的部分。

有趣的是,你说“我可以使用AOP来注入依赖关系,但我没有利用Spring的基础设施,”考虑到AOP是Spring基础设施的核心部分。两者配合得非常好。

上面的链接允许您让Spring的AOP透明地将依赖关系注入到正在创建的域对象中,而无需直接引用Spring基础架构(例如,使用运算符)。它非常聪明,但确实需要一些深层次的类加载修补。new


答案 2

Spring的依赖注入/配置仅用于配置低级技术基础设施,例如数据源,事务管理,远程处理,servlet挂载点等。

你使用spring在技术API和服务之间路由,在这些服务中,你只需要编写普通的Java代码。让 Spring 远离您的领域模型和服务实现是一件好事。首先,您不希望将应用程序的业务逻辑绑定到一个框架上,也不想让低级技术问题“泄漏”到应用程序域模型中。Java代码在IDE中比spring的XML配置更容易修改,因此将业务逻辑保留在java中可以更快地交付新功能并更轻松地维护应用程序。Java比spring的XML格式更具表现力,因此如果您坚持使用普通的Java,则可以更清楚地对域概念进行建模。


推荐