我正在使用Google Guice编写一个组件,它位于一个不使用任何依赖注入工具的web应用程序旁边。
组件中的Guice模块有几个不会改变的“固定”绑定和几个动态绑定,因为它们在web应用程序的每个请求中都会改变。
我解决这个问题的最简单(也是最糟糕)的方法是,每当web应用程序第一次要求组件做某事时,组件就会构建新的Guice模块,创建实例并将其返回给web应用程序:
public static X init(@NotNull final Foo perRequestObject, @NotNull final Bar perRequestObject2)
{
final Injector injector = Guice.createInjector(new AbstractModule()
{
@Override
protected void configure()
{
install(new NonChanging Module());
bind(Foo.class).toInstance(perRequestObject);
bind(Bar.class).toInstance(perRequestObject2);
}
});
return return injector.getInstance(X.class);
}
我认为这是一种糟糕的方法,因为根据请求构建注入器非常昂贵。我想要的是一个已经创建的注入器,我可以在运行时重写它。我在附近发现了一些东西:
1-覆盖动态绑定(答案https://stackoverflow.com/a/531110/1587864)。这仍然需要创建一个新的注入器,所以我会有同样的问题。
2-实现某种已经绑定在注入器中的工厂,并且能够访问来自Web应用程序并按请求的“动态”属性。
我不知道如何实现第二个,这个概念在Guice中存在吗?
谢谢
正如评论所说,完整的正确解决方案是范围
。假设您已经将本文中的<code>SimpleScope
public class MyWebComponent
{
private final Provider<X> theGuiceCreatedObject;
private final SimpleScope perRequestScope;
public MyWebComponent() {
perRequestScope = new SimpleScope();
Injector injector = Guice.createInjector(new AbstractModule()
{
@Override
protected void configure()
{
install(new NonChangingModule());
bind(Foo.class).toProvider(SimpleScope.seededKeyProvider())
.in(perRequestScope);
bind(Bar.class).toProvider(SimpleScope.seededKeyProvider())
.in(perRequestScope);
}
});
theGuiceCreatedObject = injector.getProvider(X.class);
}
// I assume methods called makeFoo and makeBar that can make
// a Foo or Bar for a request
// called by the web service to say "handle this request"
public RequestResult handleRequest(DataToMakeFooAndBarWith requestData) {
try {
perRequestScope.enter();
perRequestScope.seed(Foo.class, makeFoo(requestData));
perRequestScope.seed(Bar.class, makeBar(requestData));
return theGuiceCreatedObject.get().doTheActualRequestLogic(requestData);
} finally {
perRequestScope.exit();
}
}
}
我最近开始使用Google Guice,通过我在网络上找到的教程和代码工作,但现在我被困住了。 我已经尝试创建了一个,我可以在每个实体DAO的基础上扩展该。我很难弄清楚如何配置一个现有的私有Guice模块。 这里是我的,其中是一个使用作为标识的实体。类是另一个不依赖于的实体(目前,我正在尝试让它一开始就简单)。 当尝试运行以下内容时,我会得到: Google Guice用户指南在这里没有真正帮助我
我是一个尝试使用Guice的人(这里是新手!!)我的一个项目。 所以我有一个 我的实现是 我还将DataQueue接口定义为 DataQueue的实现如下 在我的AppModule.Configure方法中,我有以下代码 我的ConsumerFactory是一个带有create()方法的接口,该方法返回一个使用者 我的DataQueueFactory是一个带有create()方法的接口,该方法返回
我有一个maven项目和一个maven项目,它依赖于项目。每个项目都有一个Guice模块,将一些类绑定到接口。 在javaruntime中,是一个接口IElementFactory和一个类,该类通过构造函数注入获得IElementFactory: IElementFactory的具体实现在androidruntime项目中,称为AndroidElementFactory。其他接口的所有实现都在ja
由于绑定是在绑定模块中定义的,Google Guice 会在需要注入依赖项时使用它们。如果不存在绑定,它可以尝试创建即时绑定。绑定模块中存在的绑定称为显式绑定并且具有更高的优先级,而即时绑定称为隐式绑定。如果两种类型的绑定都存在,则考虑使用显式绑定进行映射。 以下是三种类型的即时绑定的示例。 绑定类型 描述 可注入的构造函数 非私有、无参数构造函数有资格进行即时绑定。另一种方法是使用@Inject
主要内容:Google Guice 内置绑定 示例,输出Google Guice 为java.util.logging.Logger类提供了内置绑定。Logger 的名称会自动设置为注入 Logger 的类的名称。请参阅下面的示例。 Google Guice 内置绑定 示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。
主要内容:使用@Named 注解注入,Google Guice 常量绑定 完整示例,输出Guice 提供了一种使用值对象或常量创建绑定的方法。下面例子以配置 JDBC URL 为例。 使用@Named 注解注入 这可以使用 toInstance() 方法来实现。 Google Guice 常量绑定 完整示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。