带有 Spring 的静态 util class,不确定我是否应该将其设为 SpringBean,设计问题

Static util class with Spring, unsure if I should make it a SpringBean, design concerns

我的设计的快速高级概念..

CLI tool to create AWS EBS snapshots
CLI tool just calls Java class com.util.SnapshotUtil
com.util.Snapshot calls AWS Interfacing class com.aws.AWSAdapter

命令行中的示例用法..

cli-tool create-snapshot.. calls java class eventually calling below method
SnapshotUtil.createSnapshot() // statically  call AWSAdapter.createSnapshot();

目前一切都是静态的并且在 Spring 之外。

现在我想知道 AWSAdapter 是否不应该是静态的,并且由 Spring 加载,这意味着我的 SnapshotUtil 需要通过 ApplicationContext 创建适配器,我相信,以及为它提供一个 XML 与适配器 bean 信息。

最初我认为因为这是一个处理 ebs 快照的简单实用程序,所以我可以忽略 Spring,但是 AWSAdapter 可能会被其他方式使用,但是,不确定静态是否会是一个赞成或反对。

适配器设计为仅处理 EBS 快照,因此它基本上是通过使用 AmazonEC2Client 实例创建/删除/查看快照。即使 Spring 管理的 class 想要使用此适配器,我的问题是它通过 Spring 加载适配器或只是静态调用它是否重要。

编辑以回应答案:

我开始将它变成一个 bean 并删除所有静态引用,我给它一个方法 getInstance() 它将通过 applicationContext 和 return 在初始化其他依赖项和配置后加载到调用者。当我从 spring 之外调用它时,可以吗?好像有效果,还算'injecting'吗?我很确定它没有注入,因为调用者不是 spring 管理的,但我觉得这可能是 hacky?比如,我在非 spring class 中使用 spring bean,所以我从来没有 spring 管理过,所以我觉得没有理由将实用程序变成 bean .我仍然会这样做,因为我了解其中的好处。

我 'have' 将它变成一个 bean 的一个原因是它使用了另一个 spring bean 我需要处理身份验证,但是我考虑了一下,我可以很容易地实例化另一个使用 'new' 关键字的 bean。

当我说我将我的 class 变成了一个 bean 但它对调用者来说不是 'injected' 时,我是否正确,至少在使用 getInstance() 方法时是这样?如果我在 spring bean 中使用 getInstance method(),如果我通过 spring 配置来 'inject' 实用程序会有什么不同吗?

一般来说,您应该更喜欢非静态而不是静态。关于您的具体示例,您应该使用 Spring bean,因为当您开始使用更复杂的功能扩展 application/module 时,这会给您带来更大的灵活性。

例如,很快静态 classes 将需要来自系统其他部分的一些资源(我们都知道 DI 在这里有什么帮助)。

或者您需要在某些方面建议静态调用(只是简单的调用,例如记录每个请求,但要考虑更复杂的情况,例如交易)。使用 Spring 个 bean,实现起来非常简单,而且非常重要,之后添加起来很简单,无需进行大量的重新设计和重新测试。

此外,您将更容易地将 bean 与其他 Spring API 和框架集成,这些 API 和框架已经与 Spring 很好地集成。例如,您将在 Apache Camel 路由中轻松使用您的 bean。

这些只是我想到的几点,还有很多。但是,一如既往,考虑所有的利弊并为工作选择合适的工具。

已编辑部分问题

"When I call this from outside of spring, is that okay?"

是的,直接从Spring application context 中获取bean 实例是可以的,class 不受Spring 管理,或者当bean 名称不知道直到运行。在我使用 Apache Camel 路由的示例中,这正是 Camel 所做的。 :)

"Am I correct when I say I turned my class into a bean but it is not 'injected' to callers, at least when using the getInstance() method?"

是的,它仍然是一个具有该 bean 的所有功能的 bean(其中注入了其他 bean,以及它周围的方面等)。

"If I use the getInstance method() in a spring bean, would there be any difference if I were to 'inject' the utility through spring configurations instead?"

关于这个,你可以看看这个question and at the article Martin Fowler 写的,也参考了问题

在我看来,你不应该这样做,它的可读性较差并且完全没有必要。将资源作为字段注入是一种类型安全且干净的机制,供 class 声明其依赖资源。

此外,如果频繁执行,bean 查找的开销可能很大。我在过去从事的一个项目中经历过这种情况。我不知道为什么,但是 Spring(至少我们当时使用的 Spring 版本)查找和 return 这个 bean 需要一些时间,如果执行的话会很明显在循环中。