E4 注入自己的对象

   E4有个非常不错的功能,那就是依赖注入,这可以很方便的获取需要的对象,下面我们以简单的例子了解一下注入自己的对象。

   1、首先创建一个E4工程

image

    2、编写需要注入服务对象,比如

/**
* 。
*
* @author 刘尧兴
* @version at 2011-7-15
*/
public class TestInjectObject {

String name = TestInjectObject.class.getSimpleName();

public String toString() {
return name;
}
}

package e4demo.handlers;

/**
* 。
*
* @author 刘尧兴
* @version at 2011-7-15
*/
public class TestInjectObject2 {

String name = TestInjectObject2.class.getSimpleName();

public String toString() {
return name;
}
}

3、注册服务(可选步骤)

ContextInjectionFactory是一个依赖注入工厂,可以向Domain对象注入数据和服务。

inject(Object object, IEclipseContext context)方法用于将一个对象注入到context中,如果context参数为空,则使用插件默认的context对象。

make(Class<T> clazz, IEclipseContext context) 将指定类注入到context中,会自动帮助你实例化对象(需无参构造方法)。

4、测试

在OpenHandler.java放中新增字段接受对象的注入

@Inject
   TestInjectObject testInjectObject;

   @Inject
   TestInjectObject2 testInjectObject2;

然后在execute方法中判断是否注入成功,完整例子:

package e4demo.handlers;

import java.lang.reflect.InvocationTargetException;

import javax.inject.Inject;
import javax.inject.Named;

import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;

public class OpenHandler {

@Inject
TestInjectObject testInjectObject;

@Inject
TestInjectObject2 testInjectObject2;

@Execute
public void execute(IEclipseContext context, @Named(IServiceConstants.ACTIVE_SHELL) Shell shell)
throws InvocationTargetException, InterruptedException {

System.out.println("TestInjectObject == null" + (testInjectObject == null));
System.out.println("TestInjectObject2 == null" + (testInjectObject2 == null));

FileDialog dialog = new FileDialog(shell);
dialog.open();
}
}

你不妨自己测试一下,很简单的。

 

其实你可以省略“注册服务”这个过程,程序会自动实例化一个对象,比如你在代码这样写:

@Inject
TestInjectObject testInjectObject;

@Inject
TestInjectObject testInjectObject_clone;

如果打印 testInjectObject == testInjectObject_clone 会发现结果 == false!

 

如果你需要让你的对象是单例的,给你的类加上@Singleton吧:

@Singleton
public class TestInjectObject {

   。。。。。。

}

 

这样testInjectObject == testInjectObject_clone 的结果 == true

posted @ 2011-07-15 16:58  vwpolo  阅读(743)  评论(0编辑  收藏  举报