用Base类统一注入的方式简化编程

最近我们在一个小项目作了一点新的尝试,改变以往传统的做法,用Base类统一注入管理Bean的方式来简化编程。

这个项目使用的是Webwork + Spring + Hibernate的框架,每个功能模块都有对应的一套Webwork Action、Service和Hibernate Dao。我们使用这种框架的传统做法是,在每个Action中注入需要用到的Service Bean,这样需要在Action中声明要用到的Service成员变量,并提供set方法,也要在对应的Spring配置文件中(比如application.xml)为每个Action写上<property name="xxxService" value="xxxService"/>,以便Spring来进行Ioc注入管理。这样做的好处是结构很清晰,通过配置这一整套东西,能清晰地知道每个Action都要用到哪些Service。但这么做也带来额外的工作,新写一个功能的时候,比如新建一个Action,在这个Action中用到已经存在的一些Service的方法,则需要新写很多代码和配置文件项。

为了提高开发速度,我们做了一个改进,即抽取一个BaseAction类,所有其他具体功能的Action都从BaseAction继承。在BaseAction中统一声明所有的Service Bean为 protected 成员变量,并提供对应的get、set方法。在Spring配置文件中(application.xml),只在BaseAction这个Bean中声明所有用到的Service Bean,比如<property name="xxxService" value="xxxService"/>,而每个具体的Action Bean通过parent这个属性指定它们用到的父类(比如<bean id="xxxAction" parent="BaseAction" ...></bean>),而不用每个都写<property name="xxxService" value="xxxService"/>,这个可以省略了。在每个具体的Action中,也不需要声明Service成员变量,因为父类中已经有了,只需要在用的时候通过this.getXxxService() 的方式来取得所用的Service实例。这样,通过BaseAction就把所有的Service管理起来了,你每增加一个新的Action,只需要写业务相关的代码,在Spring中配置一个简单的Bean类,而不需要考虑如何配置、注入Service Bean。别小看这么一点点改进,它能缩短很多编码时间,每一个小的改进累积起来,就能大幅提高开发效率。

这里需要提醒一点的是,一定要记得在具体Action Bean的Spring配置时加上parent属性,如果你忘了添加这个属性,虽然你的Action在代码中确实是继承了BaseAction,编译和应用服务器启动时并不会报错,但当程序执行到具体Action中用this.getXxxService()来取得BaseAction中的Service实例时,只能取到空指针null。原因是你没写parent属性,Spring不会自动去给BaseAction注入需要的Service Bean。

这套新的方案,我们专门用Load runner作了一个性能测试,在模拟访问量达到10000时(不是完全的并发),新方案的内存损耗和传统方案没有太大差别。也就是说用新方案不会对内存产生大量的额外损耗,一方面因为我的Service都是singleton的,另一方面Spring的延迟注入也减少了一些开销。因为虽然我们每一个具体业务Action都从BaseAction继承了,而BaseAction拥有所有的Service Bean,但因为每个具体Action只根据需要使用到了某几个Service,而不是所有的Service,所以只有用到的这几个Service会被注入这个Action实例所引用的BaseAction实例,在加上单实例的作用,因此,这种方案从理论上来说应该和传统方案的内存损耗是近似的。

我们打算在接下来的大型项目中使用这个方案,看看真的具体到大型项目的实际运行中,是否会有别的问题。总之,我们会持续改进我们的设计思路和方案,朝着提高开发效率的方向前进。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值