【问题标题】:Guice doesn't inject morphia returned objectGuice 不注入 morphia 返回的对象
【发布时间】:2013-05-16 17:06:23
【问题描述】:

我有一个用@Inject 标识字段的类。我使用 morphia 将这个对象保存到 MongoDB。当需要取回对象时,我执行一个查询,如下所示:

MorphiaVersionedPerson versionedPerson =  ds.find(entityClazz).filter("published.name", name).get();

据我了解,Morphia 将使用无参数构造函数来创建该对象的实例,然后使用反射来填充字段值。

Guice 应该 @Inject 的值是 null。我知道 Guice 也使用反射,但在这种情况下,guice 不会创建对象。 Morphia 创建对象。

我想我可以尝试在我的 DAO 中获取注入器并执行以下操作:

injector.injectMembers(versionedPerson )

但是,让注射器看起来有点不对劲。在这种情况下,有没有其他方法可以让 morhpia 和 Guice 互动?如何获得将必要元素 @Inject 到 morhpia 创建的对象的指导?

【问题讨论】:

    标签: java reflection dependency-injection guice morphia


    【解决方案1】:

    在这种情况下,除了使用 Injector 之外别无他法。所以直接使用应该不会觉得不自然。

    您可以在 DAO 中使用#injectMembers,但正如您所指出的,这感觉有点不对劲。它是。同样这样Guice AOP 将无法工作。 Guice 需要成为对象的创建者才能使 AOP 工作。

    我要做的是将 Guice 集成到 Morphia 中。没有使用过 Morphia,但快速浏览后发现 Morphia 即将推出 Guice 扩展。

    https://github.com/jmkgreen/morphia/blob/master/guice-plug/src/main/java/com/github/jmkgreen/morphia/ext/guice/GuiceExtension.java

    在引导代码中,我会按照以下方式做一些事情

    Morphia m = injector.getInstance(Morphia.class);
    new GuiceExtension(m, injector);
    

    如果您自己编写此扩展程序,您可以直接使用 Injector。

    OT:Do you really need the DAO? Food for thought.

    【讨论】:

    • 还要确保你的 Guice 模块将 Morphia 绑定到单个实例,否则 Guice 将创建另一个尚未扩展以使用注入器的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2013-07-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多