E4 注入自己的对象
E4有个非常不错的功能,那就是依赖注入,这可以很方便的获取需要的对象,下面我们以简单的例子了解一下注入自己的对象。
1、首先创建一个E4工程
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