在WebWork中实现IoC(2)

2XWork的组件体系结构

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或组件,依赖于BC,而B又依赖于C,则ComponentManager会按下面的顺序处理:

l         实例化C,如果实现Intializable接口就调用init()

l         实例化B,使用enabler方法设置CB使用;

l         如果B实现Intializable接口就调用init()

l         实例化A,使用enabler方法设置BA使用;

如果BC需要重用,使用enabler方法传递实例,而不是新建实例。

3)编写enablers

enabler是包含接收单个参数的一个方法的接口。参数可以是要激活的组件类或其超类。下面是一个ExchangeRateAware的例子:

public interface ExchangeRateAware {
     
     
    public void setExchangeRateService(ExchangeRateService exchangeRateService);
     
     
}
     
     

4)编写“Enabler-awareAction

Action类需要实现相关的enabler接口,以便XWorkAction执行之前调用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来解析。一个例子就是XWorkSpring集成中使用外部引用解析器。

你需要编写外部引用解析器,并在package声明中告诉XWork使用它:

<package
     
     
    name="default"
     
     
    externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver">
     
     

现在可以使用外部引用了:

<external-ref name="foo">Foo</external-ref>
     
     

属性名就是setter方法的名字,而Foo就是要查找的引用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值