3.4.1 Bean配置
Struts 2框架是一个高度可扩展的框架,对于框架的大部分核心组件,Struts 2并不是直接以硬编码的方式写在代码中的,而是以自己的IoC(控制反转)容器来管理框架的核心组件。
Struts 2框架以可配置的方式来管理Struts 2核心组件,从而允许开发者很方便地扩展该框架的核心组件。当开发者需要扩展,或者替换Struts 2核心组件时,只需要提供自己的组件实现类,并将该组件实现类部署在Struts 2的IoC容器中即可。
打开struts2-core-2.3.1.2.jar压缩包中的struts-default.xml文件,看到在该文件中配置了大量的Bean定义。该配置文件的代码片段如下:
<!-- 下面配置了Struts 2的三个类型检测器Bean --> <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name= "tiger" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/> <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name= "notiger" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/> <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name= "struts" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/> ... <!-- 下面配置了Struts 2的两个文件上传处理器Bean --> <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" name="struts" scope="default"/> <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" name="jakarta" scope="default" /> <!-- 下面配置了Struts 2的标签库处理Bean --> <bean type="org.apache.struts2.views.TagLibrary" name="s" class="org.apache.struts2.views.DefaultTagLibrary" /> ...
上面的配置文件配置了Struts 2框架的内置Bean,其中三个类型检测器Bean就是前面在struts.properties文件中允许使用的类型检测器。
在struts.xml文件中定义Bean时,通常有如下两个作用。
创建该Bean的实例,将该实例作为Struts 2框架的核心组件使用。
Bean包含的静态方法需要注入一个值。
在第一种用法下,因为Bean实例往往是作为一个核心组件使用的,因此需要告诉Struts 2容器该实例的作用——就是该实例实现了哪个接口,这个接口往往定义了该组件所必须遵守的规范。
例如下面的配置片段,我们使用一个自定义的 ObjectFactory 替换了 Struts 2 内置的ObjectFactory。替换ObjectFactory的代码片段如下:
<struts> <!-- 配置定制的ObjectFactory Bean,该Bean实现了ObjectFactory接口 实现类是MyObjectFactory --> <bean type="com.opensymphony.xwork2.ObjectFactory" name="myfactory" class="com.company.myapp.MyObjectFactory" /> ... </struts>
对于第二种用法,则可以很方便地允许不创建某个类的实例,却可以接受框架常量。在这种用法下,通常需要设置static="true"。
下面是struts-default.xml配置文件的代码片段。
<struts>
<bean class="org.apache.struts2.dispatcher.FilterDispatcher" static= "true" />
...
</struts>
提示:
对于绝大部分Struts 2应用而言,我们无须重新定义Struts 2框架的核心组件,也就无须在struts.xml文件中定义Bean。
正如前面见到的,使用<bean />元素在struts.xml文件中定义Bean,bean元素有如下几个属性。
class:这个属性是必填属性,它指定了Bean实例的实现类。
type:这个属性是可选属性,它指定了Bean实例实现的Struts 2规范,该规范通常是通过某个接口来体现的,因此该属性的值通常是一个Struts 2接口。如果需要将Bean实例作为Struts 2组件来使用,则应该指定该属性值。
name:该属性指定了Bean实例的名字,对于有相同type类型的多个Bean,则它们的name属性不能相同。这个属性也是可选属性。
scope:该属性指定 Bean 实例的作用域。该属性是可选属性,属性值只能是 default、singleton、request、session或thread其中之一。
static:该属性指定Bean是否使用静态方法注入。通常而言,当指定了type属性时,该属性不应该指定为true。
optional:该属性指定该Bean是否是一个可选Bean,该属性是一个可选属性。