Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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,该属性是一个可选属性。