spring配置好後,寫入數據時空指針異常,objectFactory

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中也就是說有3個 對象工廠,
org.apache.struts2.spring.StrutsSpringObjectFactory(struts2的spring插件提供)

org.apache.struts2.impl.StrutsObjectFactory(struts2自帶)

com.opensymphony.xwork2.ObjectFactory(xwork自帶)。
他們都可以用於產生action。

在xwork中默認使用ObjectFactory,在struts2中默認使用StrutsObjectFactory。使用struts2的spring插件的時候默認使用StrutsSpringObjectFactory,這些都是自動的,其中前兩個都是struts2的內容。都是由
<constant name="struts.objectFactory" value="spring" />
來控制,這裏的value,就是
<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這個父類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章