我有一些严重的问题要理解,如何使用依赖注入,尤其是多线程环境中的单例设计模式。

让我说我有一个班级:

public class DependencyOne {
    private DependencyTwo dependencyTwo;
    private DependencyThree dependencyThree;

    private Integer aNumber;

    public Foo(Integer aNumber, DependencyTwo dependencyTwo, DependencyThree dependencyThree) {
        this.aNumber = aNumber;
        this.dependencyTwo = dependencyTwo;
        this.dependencyThree = dependencyThree;
    }

    public doSomething() {
        dependencyTwo.doSomethingInDepOne(aNumber, dependencyThree);
    }


}

public class DependencyTwo {
    private DependencyThree dependencyThree;

    private aNumber;

    public Foo(Integer aNumber,DependencyThree dependencyThree) {
        this.aNumber = aNumber;
        this.dependencyThree = dependencyThree;
    }

    public doSomething() {
        dependencyThree.doSomethingInDepOne(aNumber);
    }


}


public class Main {
public static void main(String[] args) {

DependencyOne depTwo = new DependencyTwo("foo", "foofooo" .... <- just random config);
DependencyOne depThree = new DependencyThree(1,2,3,4,5,12,3,1235 <- just random config);

DependencyOne depOne = new DependencyOne(123, depTwo, depThree);

depOne.doSomething();




}

}

现在让我们想象一下,DependencyThree由于各种原因需要是一个单例,例如JPA EntityManagerFactory,Centralized Logging或全局级别的任何东西,而不是每个线程。

Injector injector = Guice.createInjector(new DependencyThree());

据我所知,注射器只能创建一次。

现在我的问题是,提供对DependencyThree类的一个实例的访问的最佳方法是什么。

**

我不想通过所有其他类传递dependencythree对象,以获取它的访问权限。

**

目前我刚刚创建了一个全局单例,当我要求时,它返回实例。 但有些人说,这是非常糟糕的设计,(是吗?)。 我如何使用依赖注入,在此设置,或者我不应该使用它? 这段代码只是强奸了一下,它通常在多线程环境中运行。

Guice提供了@Singleton注释,但这是每个线程而不是多线程。

我如何在Guice中实现一个全局单例,这是懒惰创建的?

===============>>#1 票数:3

@Singleton在吉斯意味着一旦创建目标类的实例,这非常相同的实例返回所有后续注入的请求。 注入器本身是线程安全的,因此可以在线程之间安全地共享。

现在,注射何时发生? 当您要求Guice获取实例而不是自己使用new运算符时,就会发生注入。

您只需要确保没有循环依赖关系,并且注入对象的生命周期是以这样的方式清楚定义的: @Singleton实例是依赖类之前创建的并且可能在之后被删除。 顺便说一句,单身人士概念本身没有任何问题:有时你只是拥有一个物理资源,而这个物理资源不能在实例上代表。 它是具有Java static和延迟加载的单例模式,它经常受到批评,因为它实现起来有点不重要,并且有更安全的替代方案(如依赖注入框架)

  ask by orbatschow translate from so

未解决问题?本站智能推荐:

2回复

使用guice进行客户端sdk /库设计模式的依赖注入

我正在为Web API构建客户端SDK并尝试通过guice应用依赖注入。 第三方将使用此Java客户端作为访问API的方式。 我希望能够注入我的外部依赖项(使用的HTTP客户端等),并为开发人员提供一种方法,如果他们想要或者我自己想要更改实现,则可以注入不同版本的这些依赖项(依赖项的一个
10回复

Java依赖注入:XML或注释

注释变得流行。 Spring-3支持它们。 CDI严重依赖它们(我不能在没有注释的情况下使用CDI,对吧?) 我的问题是为什么 ? 我听到几个问题: “它有助于摆脱XML”。 但是xml有什么不好的? 依赖性本质上是声明性的,XML对于声明非常有用(对于命令式编程来
3回复

Guice设计模式:要求显式绑定的任何优点?

我对Guice比较新,所以这可能是个基本问题。 看起来Guice可以选择要求显式绑定 。 要求显式绑定有明显的优势吗? 有人经常在实践中使用此选项吗?
3回复

构建器模式与依赖注入(例如通过Guice)

我正在开发一个简单的树形结构数据库,我通常通过Builder(Builder模式)设置依赖项或可选设置。 现在我不确定何时使用Guice,何时使用Builder模式以及何时使用静态工厂方法而不是构造函数本身。 我已经多次阅读过Effective Java,我认为它至少提到了不暴露构造函数的许
1回复

播放2.0 / 2.1 for Java和依赖注入

我们有一个新的Play 2.0项目,我们计划在添加一些复杂的第三方集成代码时引入DI。 有一个适用于Play 2.0的Guice插件,但看起来它在2.1时已经过时了,我有一种预感2.1不再那么远了。 https://github.com/typesafehub/play-plugin
1回复

Java Guice:如果您多次注入相同的依赖项,那么是否会注入相同的依赖项实例?

我有一个Java jersey 2.x项目,使用Guice作为我的依赖项注入框架。 我有这项服务 假设我创建了另一个服务类,它也注入了InMemoryAccountRepositoryImpl ,是否会注入相同的实例? 对我来说很重要,因为此实例的内部状态需要保持一致。
1回复

播放2.5生产模式无法在应用程序启动时运行的Singleton类中使用注入的ConfigurationProvider类对象

我有一个单例类,我在构造函数中注入了ConfigurationProvider类。 当我尝试访问ConfigurationProvider类方法时,该对象不可用,并在我以测试生产模式启动时抛出NullPointerException(activator testProd) 我已经在
1回复

Guice Singleton静态注射模式

我是Google Guice的新手并且从概念上理解依赖注入,但是在尝试将其合并到我的应用程序中时遇到了问题。 我的具体问题是关于Singleton对象。 这是一个例子: 首先,我的Module类,它将重的Singleton Connection接口绑定到它的实现。 现在,在我的
1回复

在Guice模块中注入单例

我用guice编写了一些模块。 这些工作很棒。 我的模块中还需要一些单例或记录器,我想将其注入这些模块中。 例如,我有我的JpaModule,我需要我的配置。 配置模块: JpaModule: 致电Guice: 我该怎么做? 或如何以一种简易的方式将配置
2回复

注入名为Guice的单身人士

我有一个简单的POJO: 我想配置我的Guice模块,以便它注入两种类型的Fizz es: 一个特殊的全局单例Fizz实例; 和 其他(非特殊) Fizz实例 我希望MyPOJO注入特殊/单例实例。 所以我修改了我的代码: 然后在我的模块中: