当前位置: 首页 > 知识库问答 >
问题:

通过Guice注入到不可变类中

乐正心思
2023-03-14

我使用了两个常见的包,Immutables和guice。在运行时发生的第一件事是将环境和其他源中的设置加载到一个单独的、非不可变的配置类中的设置中,我们将其称为myconfig,例如,它公开了一个公共的getSettingX()方法。

 MyConfig myConfig = MyConfig.intialize().create();  
 String settingX = myConfig.getSettingX();

我有一个抽象的不可变类,叫做abstractimmutable。在实例化时,需要根据MyConfig.getSettingX()设置一个字段。

@Value.Immutable
abstract class AbstractImmutable {
   abstract String getSettingX(); // Ideally set 
}

现在,我通常使用Guice将MyConfig注入到类中,并想出一种方法来实现AbstractimMutable类(避免每次构建对象时都必须手动注入MyConfig类--这是使用juice管理DI的全部原因)。但是,由于具体的不可变类是在编译时生成的,所以它不能与通常的Guice注入注释一起工作。

Immutables站点上有使用builder包注释静态工厂方法的说明,但我似乎不知道如何将其添加到抽象immutable类中。

有人有什么建议吗?

共有1个答案

唐渊
2023-03-14

据我所知,在生成的不可变类本身上没有办法做到这一点(尽管您可以使用@injectannotation做一些有趣的事情),因此您可能在这方面运气不好。

即使您是在Guice的幌子下询问,您所询问的内容还是让我想起了AutoFactory使用的模式,并且应该同样适用。实质上,通过注入工厂来利用工厂模式,然后工厂将创建不可变对象。

例如,特别提到您的案例,

@Value.Immutable
abstract class ValueObject {
    MyConfig getMyConfig();

    @Value.Derived
    String getSettingX() {
        getMyConfig().getSettingX();
    }

    String getAnotherProperty();

    class ValueObjectFactory {
        @Inject MyConfig myConfig;

        ValueObject create(String anotherProperty) {
            return ImmutableValueObject.builder()
                .setMyConfig(this.myConfig)
                .setAnotherProperty(anotherProperty)
                .build();
        }
    }
}
class SomeApplicationClass {
    @Inject ValueObjectFactory factory;

    void someMethod() {
        ValueObject = factory.create("myString");

        // ... do something with the ValueObject
    }
}
 类似资料:
  • 问题内容: 我正在尝试使用Guice注入通用类型。我的Repository 位于Cursor类中。 因此,当我创建Cursor 时,我还希望Guice将我的存储库注入Repository 。有没有办法做到这一点? 问题答案: 您必须使用: 要获取的实例,则需要: 在FAQ中有更多细节。

  • 主要内容:Google Guice 可选注入 示例,输出注入是将依赖注入对象的过程。可选注入意味着如果存在则注入依赖项。方法和字段注入可能是可选的依赖项,如果不存在依赖项,则应该有一些默认值。请参阅下面的示例。 Google Guice 可选注入 示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。

  • 我正在努力实现DI,特别是使用guice的构造函数注入。我很难理解如何将泛型的类类型注入到构造函数中。 我的课程如下: 我可以在运行时使用guice将类的类型注入构造函数吗?简而言之,我可以使用guice注入Foo构造函数吗?

  • 我希望能够通过辅助注入创建的对象来发现/注入创建对象的方法的名称。 我想做的一个例子: 不幸的是,到目前为止,我想到的实现这一点的唯一方法是 扩展辅助注射(通过复制和粘贴)以添加我的功能 写一些与辅助注射非常相似的东西,为我做这件事 写很多样板,在没有guices帮助的情况下做到这一点 我正在寻找一个解决方案,大致如下: < li >实现这一点的一些guice配置或模式 < li >实现此功能的一

  • 我正在尝试用Guice注入泛型类型。我有存储库 所以当我创建光标时

  • 我的应用程序使用Play-2.4。2/Scala-2.11。6提供了对DI的内置GUI支持 我所有的DAO都将实现绑定到下面的接口,这应该是Guice中最简单的方法 上述实现不需要添加任何模块来提供绑定。 现在由于某种原因,我不想使用@Inject注释将依赖项注入到Books类的构造函数中。所以我试着注射如下 但这给我带来了一个guice配置异常,它说: 现在需要做什么?在这种情况下,我的方法是对