在Java中创建一个简单的依赖注入容器,动态创建对象

时间:2012-02-22 09:30:20

标签: java dependency-injection

我想在java中创建一个简单的依赖注入容器。我可以通过以下方式使用的东西:

DI.register(ITheInterface, ClassImplementingInterface);
obj = DI.create(ITheInterface);

实施register&的实际代码怎么样? create看起来像?

更新

为什么我试着理解@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> ==&gt; EventDataMapper
  • IDataMapper<Venue> ==&gt; VenueDataMapper

目前,如果我这样做

di.register(IDataMapper<Event>.class, EventDataMapper.class);

我得到IDataMapperEvent未解析为变量

1 个答案:

答案 0 :(得分:3)

您可以找到JSR 330 here

的简单实现

这很容易理解。

回答您的修改:

Test1是一个包私有类Container在另一个包中没有访问Test1构造函数。您可以通过执行以下操作来解决此问题:

Constructor c = this.classMap.get(forInterface).getDeclaredConstructor();
c.setAccessible(true);
return c.newInstance();
相关问题