gpt4 book ai didi

java - Guice 的全局注入(inject)器

转载 作者:行者123 更新时间:2023-12-02 09:06:18 24 4
gpt4 key购买 nike

我正在创建一个库,为了帮助实现人体工程学,我将应用程序启动时创建的注入(inject)器传递给库中的不同组件,以便用户可以在某些上下文中执行 getInstance()无需预先计划在哪里粘贴 @Inject 注释。

以下是 API 设计的示例:

public static void main(String[] args) {
// Main injector is created here behind the scenes.
ApexApplication app = new ApexApplication()

app.get("/users/:id", context -> {
// Users can do this instead of @Inject UserDAO dao
UserDAO dao = context.getInstance(UserDao.class)
User user = dao.findUserById(context.param("id"))
//...
})
app.start();
}

为清楚起见,以下是关键实现细节的链接:

  • #1 :这是我创建初始(也是唯一)注入(inject)器的地方
  • #2 :然后我将它传递给另一个库组件作为其构造函数的一部分
  • #3 :然后另一个组件将对 getInstance() 的调用委托(delegate)给原始注入(inject)器

我知道 Guice 注入(inject)器的最佳实践是在整个应用程序中创建一个且唯一一个,用它来注入(inject)所有依赖项,然后将其丢弃;但是,考虑到我想要实现的目标,是否会推荐这种方法,或者我应该研究另一种模式?

最佳答案

我认为将带有注入(inject)器的上下文发送到每个其他类以便访问注入(inject)器并不是一个好主意。

还有另一种方法,实际上与@Jameson 的 MyModuleHelper 的想法非常相似。 DIContainer 对注入(inject)器进行静态初始化并提供公共(public)静态 API getInjector()。这样,您就可以拥有注入(inject)器,该注入(inject)器仅创建一次,并且无需样板代码即可供任何类使用:

public final class DIContainer {
private static final Injector injector;
static {
injector = Guice.createInjector(new AppModule());
}
public static Injector getInjector() {
return injector;
}
private DIContainer() {
}
}

使用示例:

ServiceProvider service = DIContainer.getInjector().getInstance(ServiceProvider.class);

可能是this post也很有用。

关于java - Guice 的全局注入(inject)器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41318222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com