随笔-193  评论-715  文章-1  trackbacks-0
本Blog所有内容不得随意转载,版权属于作者所有。如需转载请与作者联系( fastzch@163.com )。
未经许可的转载,本人保留一切法律权益。
一直以来,发现有某些人完全不尊重我的劳动成果,随意转载,提醒一下那些人小心哪天惹上官司。


缘起
随着系统中不断的增加需求,功能越来越多了。昨天,看到我项目中的application.xml已经超过了1000行,还有Acegi和XFire的配置文件,也比较长,所以就想着来分拆和瘦身。

基础
如果没有记错的话,Spring是从1.2起,开始支持自动装载的,这并不是鸡肋功能,在Spring 2.0中得到了进一步的改进。到目前为止,Spring共支持以下五种方式的自动装载:
模式说明
no

不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。

byName

根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。

byType

如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。

constructor

byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

autodetect

通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。


步骤
1,将application.xml分成两个,一个文件里面管理的是系统基本信息的Bean管理,另一个文件是业务信息的Bean管理(当然,如果你觉得还不够的话,可以将其按功能模块进一步拆分)。
拆分后当然需要更改web.xml中的配置,如下:
    <context-param>
        
<param-name>contextConfigLocation</param-name>
        
<param-value>classpath:applicationContext*.xml,classpath:xfire-servlet.xml</param-value>
    
</context-param>

2,使用byType的方式,对业务信息部分的Bean进行自动装载,因为我Class中的有些属性可能并不与XML配置中的名称一致,所以想使用这样的方式相对简单,不需要去将属性名和XML的Bean ID一一对应。配置如下:
<beans default-autowire="byType">

</beans>

来,启动应用,试试看效果吧。正在我庆幸自己不用去比对名称的时候,系统到如下阶段时停住了。
|INFO |2008-09-02 22:56:50;206|org.springframework.orm.hibernate3.HibernateTransactionManager:org.springframework.orm.hibernate3.HibernateTransactionManager.afterPropertiesSet(371)|Using DataSource [org.apache.commons.dbcp.BasicDataSource@6da8eb] of Hibernate SessionFactory for HibernateTransactionManager|
此时我等了5分钟,CPU一直被Javaw进程占用,使用率高达98%,目前还不知道为什么会这样,也请各位不吝赐教。

3,既然byType行不通,那就只能byName了,配置如下:
<beans default-autowire="byName">

</beans>
然后核对了一遍名称。为了保险,我还是将每个功能都做了一下冒烟测试,幸好不多,只有二十个功能左右,果然有两个“冒烟”的,检查一下,发现是类里面的属性名的大小写不对,改正后,一切OK。

成果
1,项目业务模块部分的Bean配置文件一下从原来的800多行变为400多行,瘦身近50%。
2,系统启动时,缩短了XML校验的时间,虽然时间每次缩小的很短,这对于调试来说,还是很值的,因为项目开发中所有调试的运行会有很多次,总量加起也不是个小数目。
3,以后增加功能模块时,就算是Copy以前的配置来改,也可以少改几个地方。
这笔买卖似乎还很值哟,^-^

总结
1,建议不要将所有Bean都设成自动装载,而只用将业务相关的Bean设成自动装载。
2,如果你的项目中名称使用很乱,没有规范,那就不要用byName的自动装载了。
3,如果是重构时使用的自动装载,一定要记得做冒烟测试。
posted on 2008-09-02 23:27 Robin's Programming World 阅读(1877) 评论(2)  编辑  收藏 所属分类: Java

评论:
# re: Spring Autowire(自动装载)的一次实践[未登录] 2008-09-08 22:58 | soleghost
如果项目很小,autowrie倒无所谓,维护起来也不是很麻烦
如果项目很大,代码的可读性下降了,反而增加维护的成本,不划算的  回复  更多评论
  
# re: Spring Autowire(自动装载)的一次实践 2008-09-09 09:49 | Robin's Java World
@soleghost
可读性下降?这话从何说起?
大的项目通常都要求有统一的编码规范,而且这个与Autowire也没有什么关系呀。
请指教!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: