【问题标题】:Guice injector inside a thread线程内的 Guice 注入器
【发布时间】:2013-01-26 07:56:58
【问题描述】:

我对使用 Guice 有疑问。我有一个我称之为Main 的类,它是使用Guice 注入的构造函数和一个每次被调用的方法都会创建一个类AppThread 的线程对象。 AppThreadMain 内部的私有类。问题是在线程的执行中,我想创建一个类ClassX 的对象。该对象是使用 Guice 注入的构造函数。我不知道注入ClassX 对象的最佳形式是什么。我的第一个解决方案是在Main 内注入Injector,并在线程内使用注入器注入ClassX 类的对象。

是否存在一种更简洁的方法来将依赖项注入线程内?

谢谢

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

    与其拥有自己的Thread 子类(无论如何都不鼓励),不如将“线程代码”编写为实现Runnable 的常规对象。你的Main 类应该注入这个类(或者如果你需要实例化未知数量的它们,你实际上可以注入一个Provider<MyRunnable>)。然后你的Main 类可以创建一个new Thread(myRunnable),它应该很好地结合在一起。

    public class MyMainClass {
        @Inject
        MyMainClass(Provider<MyRunnable> runnableProvider) { ... }
    
        public void spawnThread() {
            new Thread(runnableProvider.get()).start();
        }
    }
    
    public class MyRunnable implements Runnable {
        @Inject
        MyRunnable(ClassX myX) { ... }
        public void run() {
            ... do work ...
        }
    }
    

    【讨论】:

    • 同意,但问题是关于在Runnable 中创建ClassA 的实例。将Injector 注入Runnable 实例或使用更好的方法。
    • 是的,使用提供者比注入 Injector 更好。谢谢
    • @Andreas_D:如果可以的话,你应该尽量避免注入Injector。是的,有时您必须这样做,但通常您可以只注入 Provider&lt;T&gt; 并将其交给。我在这里使用的相同方法适用于许多情况。
    • 我想我误读了你的评论,@Andreas_D。至于将ClassA注入runnable,你可以简单地把它放在你的构造函数@Inject MyRunnable(ClassA injectedClassA) { ... }中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多