Struts2與Spring整合的原理

ObjectFactory,是xwork中很重要的一個類,是產生action的地方。單獨使用xwork的時候,action都是這個類創建的。
struts2包裝了ObjectFactory,自成了一個StrutsObjectFactory,他是繼承自ObjectFactory的一個類,因此struts2默認產生action的類就不使用xwork的ObjectFactory了,而是使用StrutsObjectFactory。

struts2的插件struts2-spring-plugin-2.1.8.1.jar,又做了一個對象工廠,StrutsSpringObjectFactory,它的父類是xwork的SpringObjectFactory,最原始的父類也是ObjectFactory,我想xwork提供SpringObjectFactory的目的就是讓實現這繼承這個類,實現spring工廠。

於是struts2和Spring整合時,其中struts2-spring-plugin-2.1.8.1.jar中的
struts-plugin.xml裏:

<constant name="struts.objectFactory" value="spring" />

<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />


在這bean裏面定義的是哪個工廠,struts2就用哪個工廠。

但是不管是哪個工廠最終這些都是有xwork控制完成的。
我們可以查看
xwork的DefaultActionInvocation類的createAction(Map<String, Object> contextMap)方法。這個方法就是工廠對象產生action的方法。我們可以看到這個類中的定義的對象工廠是
protected ObjectFactory objectFactory;
然後沒有實例化,而是通過xwork的注入機制注入
@Inject
public void setObjectFactory(ObjectFactory fac) {
this.objectFactory = fac;
}
這個地方用的是最原始的ObjectFactory工廠,但是通過我們的配置爲什麼能變成StrutsSpringObjectFactory或StrutsObjectFactory呢?
多態?因爲ObjectFactory是StrutsSpringObjectFactory和StrutsObjectFactory的父類,可以用任意的子類實例化父類。
通過<constant name="struts.objectFactory" value="xia" />這個配置,來確定注入 objectFactory的那個子類。

我們可以在DefaultActionInvocation的createAction方法打印一下objectFactory

會發現,使用不同的對象工廠,那麼這裏會打印相應的工廠。絕對不只是ObjectFactory這個父類


轉自http://aixiangct.blog.163.com/blog/static/9152246120101016113237982/

發佈了44 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章