java - Guice提供隐式动态子类的实例

标签 java dependency-injection guice

我需要帮助,我有一个AbstractModule,它有一个需要使用单个提供程序的子类列表。

我提供的类作为插件动态加载

我怎样才能实现这个目标

interface Plugin {X getX();}

class Plugin1 implements Plugin {X getX() {return X1;}}
class Plugin2 implements Plugin {X getX() {return X2;}}


public class ThreadDataModule extends AbstractModule {

    @Override
    protected void configure() {
       //x_list will contain Plugin1,Plugin2,Plugin3 classes 
       for(Plugin plugin : plugin_list_classes) {
         ->> how can i bind  'plugin.getX().class to XProvider' 
       }
    }

    public class XProvider implements Provider<X> {
        public X get() {
            return Get Plugin at Thread.getX()
        }
    }
}

谢谢

==============================

我做了类似的事情来解决这个问题,现在每个插件都必须实现 getXProvider 方法🤦‍♂️。有更优雅的方式吗?

interface Plugin {
   X getX();
   public Provider getXProvider(Callable callable);
}

class Plugin1 implements Plugin {
    public X getX() {return new X1;}

    @Override
    public Provider getXProvider(Callable callable) {
        return new Provider<X1>() {
            @Override
            public X1 get() {
                try {
                    return (X1) callable.call();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
        }
    };
}



public class ThreadDataModule extends AbstractModule {

    @Override
    protected void configure() {
       //x_list will contain Plugin1,Plugin2,Plugin3 classes 
       for(Plugin plugin : plugin_list_classes) {
         bind(plugin.getX().getClass()).toProvider((javax.inject.Provider)plugin.getXProvider(()-> {
            return m_threadIndexToDependencies.get(m_threadIndex).X;
           }));
       }
    }
}

最佳答案

我认为如果你想实现自定义提供程序,则不需要在configure中绑定(bind)。无论是一种方式,还是另一种方式。

不确定 x_list_classes 中的类与线程之间有什么关系。每个线程是否有一个类?

如果是,那么您想如何进行映射?

一般来说,您可以进行范围内绑定(bind),以便为每个范围创建一个实例:

https://github.com/google/guice/wiki/Scopes

我认为你也可以让 Thread 成为一个作用域。

或者您可能想为每个类添加自定义注释,以便可以注释 X 的不同实例以进行注入(inject),如下所示:

@Inject
public SomeClass(@Foo X x) {}

然后你需要使用annotatedWith()进行绑定(bind):

bind(X.class).annotatedWith(Foo.class).to(X1.classs);

您还需要创建注释本身,请参阅示例:

https://github.com/google/guice/wiki/BindingAnnotations

关于java - Guice提供隐式动态子类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49412390/

相关文章:

clojure - 如何在Clojure中使用Stuart Sierra的组件库

c# - Funq 支持 ResolveAll 吗?

android - Dagger 2 基类注入(inject)

java - 在 Guice 中访问注入(inject)的依赖项

scala - Play : Run tests with custom GuiceApplicationLoader

java - Android,客户端服务器通信

java - 谷歌 protobuf for Java 的“可选重复”

java - 如何使用 Jsoup 库获取对象的所有详细信息并将其保存到 bean 中?

java - 在 log4j 中配置 RollingFileAppender

java - 哪种Java Web Framework最适合Google Guice?