2、XWork的组件体系结构
(1)编写组件类
在XWork中,组件类可以是任何你想要做的。唯一的限制就是需要有一个缺省的构造函数,以便XWork在需要时进行实例化。作为选项,组件类可以实现Intializable和/或Disposable接口,以便在创建之后以及销毁之前,可以接收生命周期事件,就象下面展示的一样:
public class MyComponent implements Intializable, Disposable {
public void init () {
//do initialization here
}
public void dispose() {
//do any clean up necessary before garbage collection of this component
}
}
(2)组件依赖关系
一个不明显的特性就是可能组件依赖于另外一个组件。例如,ExchangeRateService描述为依赖于一个Configuration组件,那么,XWork会在ExchangeRateService实例化后,将Configuration组件传给ExchangeRateService实例。XWork会自动按正确的顺序初始化组件。
如果A是一个Action或组件,依赖于B和C,而B又依赖于C,则ComponentManager会按下面的顺序处理:
l 实例化C,如果实现Intializable接口就调用init();
l 实例化B,使用enabler方法设置C供B使用;
l 如果B实现Intializable接口就调用init();
l 实例化A,使用enabler方法设置B供A使用;
如果B和C需要重用,使用enabler方法传递实例,而不是新建实例。
(3)编写enablers
enabler是包含接收单个参数的一个方法的接口。参数可以是要激活的组件类或其超类。下面是一个ExchangeRateAware的例子:
public interface ExchangeRateAware {
public void setExchangeRateService(ExchangeRateService exchangeRateService);
}
(4)编写“Enabler-aware”Action
Action类需要实现相关的enabler接口,以便XWork在Action执行之前调用enabler方法传递组件实例给Action,下面是一个简单的例子:
public class MyAction extends ActionSupport implements ExchangeRateAware {
ExchangeRateService ers;
public void setExchangeRateService(ExchangeRateService exchangeRateService) {
ers = exchangeRateService;
}
public String execute() throws Exception {
System.out.println("The base currency is " + ers.getBaseCurrency());
}
}
如果对象不是Action或组件,你可以调用componentManager. initializeObject(enabledObject);显式的告诉XWork提供激活的组件。
(5)使用外部引用解析器
你可以在XWork中使用外部引用解析器,而不是由XWork来解析。一个例子就是XWork和Spring集成中使用外部引用解析器。
你需要编写外部引用解析器,并在package声明中告诉XWork使用它:
<package
name="default"
externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver">
现在可以使用外部引用了:
<external-ref name="foo">Foo</external-ref>
属性名就是setter方法的名字,而Foo就是要查找的引用。