爲什麼要使用反射?爲什麼不乾脆:
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