在非guice类中注入guice管理的依赖项

时间:2016-02-11 09:45:04

标签: java hibernate guice

我有一个类(loginForm),它将使用CustomConnectionProvider由第三方库(hibernate)实例化。我需要注入一个guice管理的依赖项class.forName().newInstance(),它将为多租户提供数据源。

我无法直接MyDatabaseFactory MyDatabaseFactory,因为@Inject不是托管bean。我无法控制它是如何被创造出来的。

我刚开始使用Guice作为Play应用程序的一部分。任何示例或想法将不胜感激,我正在寻找像CustomConnectionProvider

这样的解决方案

针对特定情况修复 幸运的是,ServiceLocator提供了一种静态方法来获取Play.application(),并且我使用它来获取我的工厂实例。我仍然想知道我是否必须在没有游戏的情况下修复它。

Play 2.5的更新 2.5中不推荐使用injector。我们需要像罗伯特建议的那样使用静态注射。

2 个答案:

答案 0 :(得分:2)

您可以使用静态注射。见https://github.com/google/guice/wiki/Injections

  

通过获取对注入类型的访问而不自己注入,对象可以部分地参与依赖注入。使用

{
  "Name": "Derek",
  "Gender": "Male"
} 

在模块中指定要在注入器创建时注入的类:

requestStaticInjection() 

Guice将注入具有@Inject批注的类的静态成员。

答案 1 :(得分:1)

实际上,requestStaticInjection不是推荐的方法。正如this link解释(This API is not recommended for general use because it suffers many of the same problems as static factories: it's clumsy to test, it makes dependencies opaque, and it relies on global state.),它在很少的情况下会产生许多问题。行为不一致,注射一直没有成功。

我不得不采取稍微不同的方法:我的情况有点复杂,我的类的实例将由Hibernate使用Class.forName()创建,这可能是静态注入可能失败。

我必须创建一个Singleton工厂,它将在模块创建开始时初始化并绑定到Guice Injector,这个工厂将保存我需要注入实际类的实际bean。它提供了一个静态方法来获取所需的bean。

public Class RequiredBeanFactory {
        private static RequiredBean bean;
        //note this is a package private
        RequiredBeanFactory(RequiredBean bean) {
            this.bean = bean;
        }

        public static RequiredBean getBean() {
            return bean;
        }
    }

在我的模块中,我正在初始化它并绑定。

public class MyModule extends AbstractModule {
    private final RequiredBean bean;

    @Inject
    public MyModule(RequiredBean bean) {
        this.bean = bean;
    }

    protected void configure() {
        RequiredBeanFactory factory = new RequiredBeanFactory(this.bean);
        bind(RequireBeanFactory.class).toInstance(factory);
    }
}

在我的HibernateCustom类中,我只使用RequiredBeanFactory.getBean()

这是一种黑客行为,可能与Guice提到的副作用相同,但它在我的掌控之中并且行为是一致的。