我有一个具有可注射字段的抽象类
'data.frame': 71896 obs. of 10 variables:
$ key : Factor w/ 6 levels "ATAB","CCNa",..: 1 1 1 1 1 1 1 1 1 1
$ Process_Time: num 4.32 4.33 4.35 4.37 4.38 ...
$ CONC_PCT : num 30.9 31 31 30.9 30.9 ...
$ STATE : Factor w/ 4 levels "Blind","Gravimetric",..: 2 2 2 2 2 2 2
$ NW : num 1.15 1.14 1.14 1.14 1.13 ...
$ SRW_SP : num 106 105 105 106 105 ...
$ FF : num 2.45 2.46 2.46 2.45 2.45 ...
$ MF : num 15.5 15.5 15.5 15.4 15.4 ...
$ Max_Mass : num 1.72 1.72 1.72 1.72 1.72 ...
$ NW_norm : num 0.67 0.667 0.665 0.663 0.66 ...
我有多个继承FF_DATA <- subset(FF_Data, STATE=="Gravimetric")
FF_NW <- ggplot(FF_DATA,aes(NW_norm,FF)) +
geom_point(aes(color = Process_Time ))+
facet_grid(key~.,scales = "free")+
scale_color_gradient()
的类。它们在某种意义上很简单
public abstract class AbstractPopulator implements ITemplatePopulator {
@Inject
private ITemplatePopulator next;
但是我需要每个人都有自己注入的AbstractPopulator
字段。例如public class ImportsPopulator extends AbstractPopulator
public class FieldsPopulator extends AbstractPopulator
public class LeftHandSidePopulator extends AbstractPopulator
我需要next
等等。
如何使用leftHandSide
实现这一目标?
答案 0 :(得分:0)
作为解决方案,我决定这样做。
在AbstractPopulator
中,我添加了抽象方法injectNext
protected abstract void injectNext(ITemplatePopulator next);
并删除了字段@Inject
本身的next
注释。
在每个子类中,我都像这样实现了这个方法
@Override
@Inject
protected void injectNext(@Named("rightHandSidePopulator") ITemplatePopulator next) {
setNext(next);
}
我通过@Named
指定了责任链中下一个populator的名称。
最后一个populator是特殊的
@Override
@Inject(optional = true)
protected void injectNext(@Named("null") ITemplatePopulator next) {
setNext(next);
}
我将optional
注释的Inject
参数设置为true,因为根据Guice
文档
方法和字段注入可以是可选的,这会导致Guice无声 当依赖项不可用时忽略它们
因此,如果没有找到null
名称的对象,则它将不会连接next
。
在模块类中,我绑定了类
@Override
protected void configure() {
bind(ITemplatePopulator.class)
.annotatedWith(Names.named("packageNamePopulator")).to(PackageNamePopulator.class);
...
并guice
在需要时使用它
Injector injector = Guice.createInjector(new PopulatorModule());
ITemplatePopulator first = injector.getInstance(PackageNamePopulator.class); // first in chain
它似乎工作正常,但我不确定它是否是最佳解决方案和注释导入
import com.google.inject.Inject;
import com.google.inject.name.Named;