2012-02-22 36 views
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); 

我得到IDataMapperEvent都沒有解決一個變量

回答

3

你可以找到一個簡單的實現JSR 330 here

這很容易理解。

爲了回答您的編輯:

Test1的是包私有類Container是另一個軟件包中沒有訪問Test1的構造。您可以解決此通過執行以下操作:

Constructor c = this.classMap.get(forInterface).getDeclaredConstructor(); 
c.setAccessible(true); 
return c.newInstance(); 
+0

爲什麼我理解鏈接中的內容,這將是巨大的,如果你能在我試圖在這在我的更新主要問題 – 2012-02-22 12:23:15

+0

指出我的錯誤謝謝您的幫助。我發現我不能'註冊(IDataMapper .class,...)'它說'IDataMapper'和'Event'沒有解析成變量,我該如何解決這個問題?每個DataMapper需要1個接口嗎? – 2012-02-23 01:12:08

+0

註冊通用接口會有些困難。由於類型擦除,IDataMapper 在運行時僅僅是IDataMapper。 – Justin 2012-02-28 07:35:59