Guice辅助注射用于打字班

时间:2019-02-10 04:55:48

标签: java guice

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

这是我的实现。

function catch_that_image($my_postid) {

    global $post;
    $first_img = '';
    ob_start();
    ob_end_clean();
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', get_post_field('post_content', $my_postid), $matches);
    $first_img = $matches [1] [0];
    return $first_img;

}  

工厂界面。

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);
}

我收到错误消息:“ DaoFactory不能用作键;它没有完全指定”。

我应该如何配置FactoryModuleBuilder?

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

1 个答案:

答案 0 :(得分:0)

辅助注入期望有一个绑定来选择要返回的内容-Factory接口的参数必须是所需实现的构造函数中带@Assisted注释的参数。< / p>

在这种情况下,这意味着为了使DaoFactory.getDao采取T,则DaoImpl<T>的构造函数将需要采用该T实例(带有注释@Assisted),然后以某种方式足以使该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.getDao带有一个T实例,但是DaoImpl的构造函数是DaoImpl(@Assisted final Class<T> clazz)-辅助注入工厂必须采用预期传递给构造函数。对于您的问题,这是个好消息-您只需更改工厂声明即可:

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

现在,您以类似getDao的名称调用MyEntity.class,并将获得一个Dao<MyEntity>实例,该实例是由guice内部调用new DaoImpl(MyEntity.class)创建的。

如果您希望它特定于某个对象,则调用instance.getClass()并将其传入将产生一些您应该理解的泛型效果,因为getClass()实际上返回了一个Class<?>,或者最好返回Class<? extends WhateverMyDeclaredTypeIs>。请考虑以下内容:

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