复合材料的依赖注入(E4,RCP,SWT)

时间:2014-01-24 11:11:53

标签: java dependency-injection swt e4

我正在开发E4 RCP应用程序,我遇到以下问题: 我有一个在应用程序开头不可见的部分(toBeRendered =“false”visible =“false”)。 当一个按钮点击其他声部时,我会执行以下操作:

MPart s = partService.findPart("S");
if (s != null) {
s.setToBeRendered(true);
s.setVisible(true);
partService.activate(s); }

这很有效。因此,如果用户打开部件,则通过类在该部件上创建Composite,并且在此类中我有依赖注入:

public class S {
    ....
    @Focus
    public void focusGained() {
        ...
        MyComposite m = new MyComposite(parent, SWT.NONE);
        ...
    }
}



public class MyComposite extends Composite {

    @Named("list")
    private HashMap<String, Ex> myMap;

    public MyComposite(Composite parent, int style) {
            super(parent, style);
            myMap.get("key");
        }
}

但是我在myMap.get(“key”)得到一个NullPointerException;所以注射不起作用。 它适用于另一个Part,它是在创建Composite之前创建的,所以我不明白为什么这个注入不起作用。

是的,有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

仅在应用程序模型知道的对象上执行注入。您自己正在创建MyComposite,因此未进行注射。

您可以使用以下内容进行注射:

MyComposite m = new MyComposite(parent, SWT.NONE);

ContextInjectionFactory.inject(m, context);

注意:这不会在构造函数中执行注入,使用@PostConstruct方法。

在任何情况下,只有在构造函数运行之后才进行字段注入,因此构造函数代码永远不会在注入时运行。

更新:您在该字段上也只有@Named,您还需要@Inject

所以你的班级需要看起来像:

public class MyComposite extends Composite {

  @Named("list")
  @Inject
  private HashMap<String, Ex> myMap;

  public MyComposite(Composite parent, int style) {
        super(parent, style);
  }

  @PostConstruct
  void postConstruct() {
        myMap.get("key");
  }
}