gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:07:03 25 4
gpt4 key购买 nike

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

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 .还有一个问题,我想创建基于泛型接口(interface)的类。例如。

  • IDataMapper<Event> ==> EventDataMapper
  • IDataMapper<Venue> ==> VenueDataMapper

目前,如果我这样做

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

我得到 IDataMapperEvent未解析为变量

最佳答案

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

这很容易理解。

回答您的编辑:

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

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

关于java - 在 Java 中创建一个简单的依赖注入(inject)容器,动态创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9392182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com