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。