当前位置: 首页 > 面试题库 >

Guice在不使用@Singleton的情况下将单个实例注入多个对象

苏骏
2023-03-14
问题内容

我正在阅读Guice文档,并且遇到了一个标题为“ 消除周期”(推荐)的部分,这引起了我的极大兴趣,因为正是这个问题才导致我今天使用该文档。

基本上,要消除循环依赖性,您可以“将依赖性案例提取到单独的类中”。 好的,那里没有新内容。

因此,在示例中,我们有。

public class Store {
        private final Boss boss;
        private final CustomerLine line;
        //...

        @Inject public Store(Boss boss, CustomerLine line) {
                this.boss = boss; 
                this.line = line;
                //...
        }

        public void incomingCustomer(Customer customer) { line.add(customer); } 
}

public class Boss {
        private final Clerk clerk;
        @Inject public Boss(Clerk clerk) {
                this.clerk = clerk;
        }
}

public class Clerk {
        private final CustomerLine line;

        @Inject Clerk(CustomerLine line) {
                this.line = line;
        }

        void doSale() {
                Customer sucker = line.getNextCustomer();
                //...
        }
}

您有一个Store和一个Clerk,每个都需要引用的一个实例CustomerLine。这个概念没有问题,并且可以通过经典的依赖注入轻松实现:

CustomerLine customerLine = new CustomerLine();
Clerk clerk = new Clerk(customerLine);
Boss boss = new Boss(clerk);
Store store = new Store(boss, customerLine);

这很容易,但是现在,我需要通过Guice注入来做到这一点。因此,我的问题是实现以下内容:

您可能要确保商店和文员都使用相同的CustomerLine实例。

是的,这正是我想要做的。 但是如何在Guice模块中做到这一点?

public class MyModule extends AbstractModule implements Module {
    @Override
    protected void configure() {
        //Side Question: Do I need to do this if there if Boss.class is the implementation?
        bind(Boss.class);
        bind(CustomerLine.class).to(DefaultCustomerLine.class); //impl
    }
}

我用我的模块创建一个注射器:

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

现在,我想要一个实例Store

Store store = injector.getInstance(Store.class);

这将注入的新实例CustomerLine,并Boss进入该实例StoreBoss但是,获取的实例Clerk也注入的实例CustomerLine。此时,这将是一个新实例,该实例对于注入的实例是唯一的Store

再问问题

  • 在不使用的情况下,如何Store和可以Clerk共享同一实例@Singleton

请让我知道是否需要更多信息,或者这个问题不够清楚,我将进行修订。


问题答案:

您应该使用提供者

public class StoreProvider implements Provider<Store> {
  @Inject 
  private Boss boss ;

  public Store get() {
    return new Store(boss, boss.getClerk().getCustomerLine());
  }
}

然后将其绑定到您的模块中

bind(Store.class).toProvider(StoreProvider.class);



 类似资料:
  • 我有一个单例类定义为: 我有另一个类使用这个单例类,但这个类必须使用新操作符创建。因此,我不能使用构造函数注入或setter注入等。 我当然可以将此实例传递到MyClass的构造函数中,但从我的程序上下文来看,这不是一个很好的设计。 另一个解决方案是为MySingletonClass创建一个静态getInstance方法,这样我就可以从程序中的任何地方获取实例。但我想知道Guice是否支持类似的东

  • 我的核心应用程序完成了。我能够成功地加载模块,但我仍然不能正确地使用guice在我的模块中注入依赖项。我的核心应用程序使用service loader生成模块,并使用Guice的AbstractModule的install方法安装它们。下面是一个示例代码:(简化) 每个模块都实现了IModule接口,扩展了Guice的module接口。让我困惑的是,当不建议到处都有注入器时,我如何提供插入实例(例

  • 我们是这样做的: 但是我们有很多类具有as依赖性,我们不想每次创建实例时都添加这些代码。 那么,有没有办法在创建B的实例时自动注入A的实例?

  • 我正在做一个使用依赖注入GoogleGuice框架的项目。 可以将类与singleton作用域绑定在一起,如下所示: 如果类本身是一个真正的单例类: 或者 因此,可以在项目中声明两个单例,第一个由Guice声明,第二个由传统方式声明。 Google Guice还可以使用方法将Interface绑定到特定实例。 因此,在Java中,用以下声明绑定Singleton,而不是绑定Singleton作用域

  • 我有一个已有的名为Legacy的类,它大部分是用旧学校的单例模式编写的。现在我想介绍一个新的领域,我想使用Guice。Legacy本身不受Guice控制,它由另一个服务类使用(在服务类内部,它调用Legacy类的getInstance()来检索Legacy对象),并且该服务类是使用Guice注入器创建的。 我尝试的是将方法注入到Legacy类中 并且在服务的模块文件中,我绑定了NewField对象

  • 免责声明:我读了以下关于JDK动态代理和CGLIB的文章:https://stackoverflow.com/a/21762454/2674303 我读过以下有趣的文章:将Spring原型bean注入单例bean 原型: 测试: 很明显,测试失败了,因为注射只发生一次,实际结果是1,但我们预期是2。 第二种情况: 当我们开始测试时,我们看到实际结果是6,因为内部方法messageBuilder被访