为子类指定注入

时间:2018-03-31 12:23:25

标签: java dependency-injection guice

我有一个具有可注射字段的抽象类

'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实现这一目标?

1 个答案:

答案 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;