如何手动实施依赖注入?

时间:2010-08-21 09:59:44

标签: java reflection dependency-injection

我们如何在不使用容器设备的情况下手动注入对象。我通过以下反思做了类似的事情。

Class actionClass = Class.forName("SampleClass");
Object actionObject = actionClass.newInstance();
Method reqMethod = actionClass.getMethod("setRequest", HttpServletRequest.class);
reqMethod.invoke(actionObject,request);

这是做DI的正确方法吗?

我的目的是从调度程序过滤器动态地将请求对象传递给不同的控制器类,在那里我们获取请求和响应对象。 我担心反思的表现。是否有替代做DI?

5 个答案:

答案 0 :(得分:5)

依赖注入只不过是为类提供依赖,而不是让它自己找到它们(通过单例/查找等)。因此,您可以通过代码轻松地执行此操作:

DatabaseConnection dc = new DatabaseConnection();
MyDAO dao = new MyDAO(dc);

(伪代码)。这里MyDAO正在注入数据库连接。如果该数据库连接实现了一个接口,您可以在测试期间轻松模拟它。

答案 1 :(得分:2)

好吧,当你使用setter方法或通过构造函数将一个对象设置为另一个对象时,它也是依赖注入。依赖注入仅意味着在对象中创建关系(依赖)。

像你一样使用反射只是它的另一种形式。

答案 2 :(得分:1)

你为什么要用反射?为什么不简单:

SampleClass action = new SampleClass();
action.setRequest(request);

它做同样的事情,但更具可读性,允许编译器检查实际存在的类型和方法,为调用的方法提供Javadoc,使IDE能够协助重构,...

它仍然是依赖注入,因为该操作不会查找其请求,而是在初始化期间接收请求。

编辑:Thorbjørn要求我展示如何使用该操作。它本身会被注入(使用setter)到任何使用该动作的组件中。然后该组件将使用注入的操作对象。

SampleClass action = new SampleClass();
action.setRequest(request);
Servlet servlet = new ActionBasedServlet();
servlet.setAction(action);

如果servlet的有效期超过action,即每次需要使用Action,则可以使用ActionFactory来设置servlet进入SampleClass action = new SampleClass(); Servlet servlet = new ActionBasedServlet(); servlet.setAction(action);

在这个具体的案例中,我会怀疑该操作是否真的需要将请求作为其状态的一部分,或者可以是不可变的,并且只是作为方法参数对Servlet传递的请求进行操作。在这种情况下,启动时初始化将执行:

ActionBasedServlet

public void serve(Request req, Response resp) { foo(); action.act(req, resp); bar(); } 将定义

{{1}}

答案 3 :(得分:0)

依赖注入意味着您可以“通过魔法”获得正确初始化的引用。

使用请求对象调用setRequest()方法,但DI也经常允许在不调用方法的情况下设置字段。

Guice并不像这样需要一个容器,而是在main方法中使用类加载器魔术。这对你有用吗?

答案 4 :(得分:0)

Spring框架是最受欢迎的DI实现之一。它也是开源。 您可以查看类org.springframeowrk.beans.BeanUtils,特别是方法copyProperties(所有4个),以获取有关如何执行此操作的示例。 有关更多信息,您还可以查看org.springframework.beans.factory.BeanFactory的类层次结构,以了解不同的策略。