gpt4 book ai didi

java - 扩展 guice - guicy 的方式

转载 作者:行者123 更新时间:2023-12-02 06:36:40 25 4
gpt4 key购买 nike

因此,我尝试用自己的一些注释来扩展 guice,几乎遵循我在这里找到的精彩文章:http://developer.vz.net/2012/02/08/extending-guice-2/

这对我来说效果很好,除了:

Now in my module I instantiate one of these services:

  final SchedulerService schedulerService = new SchedulerService();

这就是隐藏的邪恶。这家伙很幸运,他只需要简单的对象,没有任何依赖关系。但就我而言,我的 Service 需要引用另外两个子服务。由于他使用 new 来创建 Service,我需要对这两个子服务使用 new,这样我就能够创建它。所以我无法将一些属性注入(inject)到这些子服务中。实际上,我正在创建整个对象子树,但它没有被图形化。

有办法解决吗?我可以让 Guice 为我实例化 Service,然后在 TypeListener 中注册它吗?

最佳答案

实际上,您可以使用 getProvider (在 BinderAbstractModule 上)从模块内访问注入(inject)项的提供者,只要您保证不调用 get 直到注入(inject)器存在之后。 (如果你这样做的话,你会get an IllegalStateException。)

此时您的代码如下所示:

Provider<YourService> yourServiceProvider = getProvider(YourService.class);
final InjectionListener injectionListener = new InjectionListener() {
public void afterInjection(Object injectee) {
yourServiceProvider().get().accept(injectee);
}
}

这里唯一的问题是注入(inject)您的服务及其依赖项可能也会尝试触发您的 InjectionListener,可能会导致无限循环。您可以通过添加空保护并在服务为空时忽略所有注入(inject)来解决这个问题。不过,更好的选择可能是创建一个没有监听器的注入(inject)器来引导 YourService,并将监听器添加到子注入(inject)器中:

Injector injectorWithoutListener = Guice.createInjector(new YourServiceModule());
YourService yourService = injectorWithoutListener.getInstance(YourService.class);
Injector finalInjector = injectorWithoutListener.createChildInjector(
new YourInjectionListenerModule(yourService), new EverythingElseModule());

请注意,在父注入(inject)器中配置了单例行为的对象仍将在那里创建,因此在 finalInjector 中创建的实例将与 injectorWithoutListener 中的实例共享单例行为。您还可以阅读更多关于 createChildInjectorbinding resolution order .

关于java - 扩展 guice - guicy 的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19569599/

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