我需要帮助,我有一个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);
您还需要创建注释本身,请参阅示例:
关于java - Guice提供隐式动态子类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49412390/