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

用于类型化类的Guice辅助注入

朱典
2023-03-14

我正在尝试在Guice进行辅助注射。

这是我的实现。

public interface Dao<T> {
    T get(String id);
}

public class DaoImpl<T> implements Dao<T> {
    private final Class<T> clazz;
    DaoImpl(@Assisted final Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override 
    public T get() {
      //Some impl code
      return T;
    }
}

工厂界面。

public interface DaoFactory {
    <T> Dao<T> getDao(Class<T> clazz);
}

吉思模块:

public class DaoModule extends AbstractModule {

    @Override
    protected void configure() {
        install(new FactoryModuleBuilder()
                .implement(new TypeLiteral<Dao<? extends Entity>>() {},
                        new TypeLiteral<DaoImpl<? extends Entity>>() {})
                .build(DaoFactory.class));
    }
}

我得到错误:“DaoFactory不能用作键;这一点没有充分说明”。

我应该如何配置FactoryModuleBuilder?

我的目标是在运行时使用DaoFactory获取Dao的类型化实例

共有1个答案

牧业
2023-03-14

辅助注入期望有一个绑定来选择你想要返回给你的东西——你的工厂接口的参数必须只是所需实现的构造函数中的@辅助注释参数。

在这种情况下,这意味着为了让DaoFactory.getDao取一个T,那么DaoImpl。

public class DaoImpl<T> implements Dao<T> {

    public DaoImpl(@Assisted T instance) {
        // Do something with the instance so this Dao is wired up right.
        // perhaps with instanceof or instance.getClass()?
    }

    @Override 
    public T get() {
      //Some impl code
      return T;
    }
}

这就是辅助注入知道如何做的所有事情 - 可以以某种方式创建运行时查找并不是魔法,但这对您来说可能已经足够了,具体取决于您的用例。我不确定为什么 DaoFactory.getDao 会采用 T 的实例,然后 Dao.get() 也会返回一个 T,但由于这是问题中示例代码的一部分,我猜你已经计划好了。

编辑后更新:

DaoFactory.get道接受一个T实例,但Dao Impl的构造函数是Dao Impl(@辅助最终类

public interface DaoFactory {
    <T> Dao<T> getDao(Class<T> obj);
}

现在你用MyEntity.class之类的东西作为参数调用getDao,会得到一个

如果您希望它特定于某个对象,那么调用< code>instance.getClass()并将其传入将会产生一些您应该理解的泛型效果,因为< code>getClass()实际上返回了一个< code >类

class MyClass {}
class MySubclass extends MyClass{}

MyClass foo = new MySubclass();

factory.getDao(foo.getClass());// the generics will be a Dao<? extends MyClass>, 
// not a Dao<MySubclass>, even though the DaoImpl.clazz holds an instance
// of MySubclass

 类似资料:
  • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

  • 我已经使用google-guice和辅助注射机制有一段时间了。因为我在scala,刚刚发现scala-guice,我也对使用它感兴趣。但是我对如何使用辅助注射感到困惑。没有使用辅助注射的例子。 因此,我的问题是:是否可以使用scala guice辅助注射,如果可以,请提供一个简单的例子? 此外,对于google-guice,我使用以下库:javax.inject.jar、guice-3.0.jar

  • 我有一个工厂是这样的: 这样的类: 如何正确使用Google Guice来做同样的事情?我尝试了辅助注射,但我不确定如何创建“UrlBuilder”。谁能帮忙?

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

  • 我一直在用guice做一个项目。 我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。 演示代码 我想知道的是,如果我可以用替换工厂,直接注入的实现(请注意,它们应该使用辅助注入)? 谢谢你。

  • 目前,我将辅助注射与命名参数一起使用,如下所示: 这很棒。但是我认为使用字符串作为参数的标识符有点难看。我想做的是以下内容: 所以本质上我想要自定义辅助注释。有办法做到这一点吗?