2
我想在java中創建一個簡單的依賴注入容器。我的東西可以通過以下方式使用:用Java創建簡單的依賴注入容器,動態創建對象
DI.register(ITheInterface, ClassImplementingInterface);
obj = DI.create(ITheInterface);
如何可能實際的代碼實現register
& create
樣子?
UPDATE
爲什麼我試着去理解由@Bill提供的鏈接,我想知道什麼是錯我的嘗試:
public class Container {
protected static Container instance;
protected Hashtable<Class<?>, Class<?>> classMap;
protected Container() {
this.classMap = new Hashtable<Class<?>, Class<?>>();
}
public static Container getInstance() {
if (Container.instance == null)
Container.instance = new Container();
return Container.instance;
}
public void register(Class<?> forInterface, Class<?> toUse) {
this.classMap.put(forInterface, toUse);
}
public Object create(Class<?> forInterface) throws Exception {
if (!this.classMap.containsKey(forInterface))
throw new Exception("Dependency Ingection Container does not have a class registered for use with " + forInterface.getName());
return this.classMap.get(forInterface).newInstance();
}
}
測試代碼:
interface ITest {
public String getName();
public void setName(String name);
}
class Test1 implements ITest {
protected String name;
@Override
public String getName() {
return this.name;
}
@Override
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) throws Exception {
Container di = Container.getInstance();
di.register(ITest.class, Test1.class);
ITest t1 = (ITest)di.create(ITest.class);
t1.setName("Yay!!!");
System.out.println(t1.getName());
}
}
我得到的錯誤:
Exception in thread "main" java.lang.IllegalAccessException: Class dependencyinjection.Container can not access a member of class Test1 with modifiers ""
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95)
at java.lang.Class.newInstance0(Class.java:366)
at java.lang.Class.newInstance(Class.java:325)
at dependencyinjection.Container.create(Container.java:27)
at Test.main(Test.java:32)
更新2
我想,當我把課public
它會奏效。還有一個問題,我想創建基於通用接口的類。例如。
IDataMapper<Event>
==>EventDataMapper
IDataMapper<Venue>
==>VenueDataMapper
目前,如果我做
di.register(IDataMapper<Event>.class, EventDataMapper.class);
我得到IDataMapper
和Event
都沒有解決一個變量
爲什麼我理解鏈接中的內容,這將是巨大的,如果你能在我試圖在這在我的更新主要問題 – 2012-02-22 12:23:15
指出我的錯誤謝謝您的幫助。我發現我不能'註冊(IDataMapper .class,...)'它說'IDataMapper'和'Event'沒有解析成變量,我該如何解決這個問題?每個DataMapper需要1個接口嗎? –
2012-02-23 01:12:08
註冊通用接口會有些困難。由於類型擦除,IDataMapper在運行時僅僅是IDataMapper。 –
Justin
2012-02-28 07:35:59