使用依赖项注入作为单例的替代方案 我一直都知道独生子是“坏”的,但直到现在我已经从C++中移入java,我决定找到一个方法来绕过他们。通过一点阅读,我发现工厂或依赖注入都可能完成这项工作,但我希望得到一些确认

使用依赖项注入作为单例的替代方案 我一直都知道独生子是“坏”的,但直到现在我已经从C++中移入java,我决定找到一个方法来绕过他们。通过一点阅读,我发现工厂或依赖注入都可能完成这项工作,但我希望得到一些确认,java,dependency-injection,singleton,guice,Java,Dependency Injection,Singleton,Guice,例如,我正要编写一个AnimationCache单例,它将存储一个贴图。不同的类应该能够在任何地方访问这个类(基本上),以便它们可以轻松有效地加载动画。用一个非常简单的例子来说明使用DI时等效代码的样子会很好 此外,Guice是否是非web应用程序DI的良好框架?我曾使用Spring进行web开发,但我不确定它是否适用于游戏。使用Spring,DI非常简单。使用@Autowired注释,您甚至不需要额外的xml来连接内容或setter方法。类中需要访问以前是您的单身者的成员可以 这里有一个很好的

例如,我正要编写一个AnimationCache单例,它将存储一个
贴图
。不同的类应该能够在任何地方访问这个类(基本上),以便它们可以轻松有效地加载动画。用一个非常简单的例子来说明使用DI时等效代码的样子会很好


此外,Guice是否是非web应用程序DI的良好框架?我曾使用Spring进行web开发,但我不确定它是否适用于游戏。

使用Spring,DI非常简单。使用@Autowired注释,您甚至不需要额外的xml来连接内容或setter方法。类中需要访问以前是您的单身者的成员可以


这里有一个很好的例子:

Spring和Guice会很好。我个人更喜欢Guice进行纯粹的依赖注入,但Spring提供了更多

代码如下所示:

public class AnimationCacheClient {

    private AnimationCache cache;

    @Autowired // for Spring, or
    @Inject // for Guice (but I think Spring also supports it now)
    public AnimationCacheClient(AnimationCache cache) {
        this.cache = cache;
    }

    // ...
}
我个人更喜欢构造函数注入,但也可以使用setter注入或字段注入


但是请注意,DI的目的并不是要有“简单的单例”。它的主要目的是通过能够注入模拟依赖项(此处为模拟
AnimationCache
实例),使代码(此处为
AnimationCache
的代码)易于单元可设置。

我最近在Singleton上“使用”了它,它可能有多糟糕(或没有),以及如何绕过它。非常值得一读。

感谢您提供的代码示例。这看起来很简单。所以我错误地认为依赖注入可以取代单例?我真的在寻找一种更好的方法,让代码能够访问一个类,而这个类应该只有一个。不,你没有错。默认情况下,SpringBean是单例的。默认情况下,guicebean是原型,但可以配置为单例。我只是想指出,DI的主要目标不是让单身变得容易。它的主要目标是使测试变得容易。Spring DI不仅适用于Web应用程序。更新:您可能还需要考虑。自2017-04年起,标准化。专为Java SE和Java EE设计。此问题及其答案可能与未来读者相关: