Struts2的大部分核心組件不是以硬編碼的形式寫在代碼中,而是通過自身的IoC容器來管理的。
Struts2以可配置的形式來管理核心組件,所以開發者可以很容易的擴展框架的核心組件。當開發者需要擴展或者替換Struts2的核心組件時,只需要提供自己的組件實現類,並部署在Struts2的IoC容器中即可。
我們打開struts2-core-2.2.1.1.jar中的struts-default.xml文件,可以看到大量的Bean的定義。如下代碼片段:
<struts> <!—- 兩個對象工廠組件--> <bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" /> <bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" /> ... ... |
而我們在struts.xml定義Bean時,通常有以下兩個作用:
1、 創建的Bean實例作為Struts2框架的核心組件使用。
2、 Bean的靜態方法需要一個值注入。
對於第一種用法,Bean的實例作為核心組件使用。因此需要告訴Struts2容器實例的作用----即實現了Struts2的某個接口,這個接口定義了該組件必須遵循的規范。
例如下面我們使用一個自定義的ObjectFactory對象來替換Struts2的內置ObjectFactory
<!—-配置自定義的ObjectFactory Bean,名稱為myFactory, 實現com.opensymphony.xwork2.ObjectFactory 類, 實現類com.smp.ObjectFactory --> <bean name="myFactory" type="com.opensymphony.xwork2.ObjectFactory" class="com.smp.ObjectFactory" />
|
在使用<bean/>元素在struts.xml文件中定義Bean,bean元素有以下幾個屬性
class:這個屬性是個必填屬性,它指定了Bean實例的實現類。
type:這個屬性是個可選屬性,它指定了Bean實例實現的Struts2的規范,該規范通常是通過某個接口或者在此前定義過的Bean,因此該屬性值通常是個接口或者此前定義過的Bean的name屬性值。如果需要將Bean的實例作為Strut2組件使用,則應該指定該屬性的值。
name:該屬性是個可選屬性,它指定的Bean實例的名字,對於有相同type的多個Bean。則它們的name屬性不能相同。
scope:該屬性是個可選屬性,它指定Bean實例的作用域,該屬性的值只能是default、singleton、request、session或thread之一。
static:該屬性是個可選屬性,它指定Bean是否使用靜態方法注入。通常而言,當指定了type屬性時,該屬性就不應該指定為true。
optional:該屬性是個可選屬性,它指定Bean是否是一個可選Bean。