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

在Java中创建一个简单的依赖项注入容器,动态创建对象,java,dependency-injection,Java,Dependency Injection,我想用java创建一个简单的依赖项注入容器。我可以通过以下方式使用: DI.register(ITheInterface, ClassImplementingInterface); obj = DI.create(ITheInterface); 实现注册和创建的实际代码是什么样子的 更新 为什么我试图理解@Bill提供的链接,我想了解我的尝试有什么问题: public class Container { protected static Container instance;

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

DI.register(ITheInterface, ClassImplementingInterface);
obj = DI.create(ITheInterface);
实现
注册
创建
的实际代码是什么样子的

更新

为什么我试图理解@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();
    }
}
我得到的错误是:

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

我想当我把这个类
公之于众
时,它就会起作用。还有一个问题,我想创建基于泛型接口的类。例如

  • IDataMapper
    ==>
    EventDataMapper
  • IDataMapper
    ==>
    VenueDataMapper
现在,如果我

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

我得到
IDataMapper
Event
未解析为变量

您可以找到JSR 330的一个简单实现

这很容易理解

要回答您的编辑,请执行以下操作:

Test1是一个包,另一个包中的私有类容器无权访问Test1构造函数。您可以通过执行以下操作来解决此问题:

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

为什么我理解链接中的内容,如果你能在我的主要问题更新中指出我的错误,那就太好了谢谢你的帮助。我发现我无法将
寄存器(IDataMapper.class,…)
它说
IDataMapper
Event
解析为变量,我如何解决这个问题?每个DataMapper是否需要一个接口?注册一个通用接口将有点困难。由于类型擦除,IDataMapper在运行时只是IDataMapper。
Constructor c = this.classMap.get(forInterface).getDeclaredConstructor();
c.setAccessible(true);
return c.newInstance();