为什么要使用反射?为什么不干脆:
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
每一次,一个可以代替setter方法注入的ActionFactory
到servlet
。
在这个具体的例子,我会质疑行为是否真的需要保持一个请求作为其状态的一部分,也可以是不可变的,只是作用于由Servlet作为方法参数传递的请求。在这种情况下,引导时初始化会做:
SampleClass action = new SampleClass();
Servlet servlet = new ActionBasedServlet();
servlet.setAction(action);
和ActionBasedServlet
将定义
public void serve(Request req, Response resp) {
foo();
action.act(req, resp);
bar();
}
我喜欢“魔术”这个词。初始化如何发生。它是如何在Spring或类似的DI容器中完成的。 – 2010-08-21 10:08:15
这个想法是将注入的类和注入发生的类从初始化中移走,所以他们不知道它是如何发生的。然后将注入代码移到哪里,取决于实现,而_you_本质上不需要知道。最后使用了反射,但这就像说Hibernate最终使用JDBC一样。 – 2010-08-21 10:29:30
我的意图是将请求对象从调度程序过滤器动态地传递给不同的控制器类,在那里我们获取请求和响应对象。 – 2010-08-21 11:07:34