分类:
2008-09-09 16:34:05
缘起
随着系统中不断的增加需求,功能越来越多了。昨天,看到我项目中的application.xml已经超过了1000行,还有Acegi和XFire的配置文件,也比较长,所以就想着来分拆和瘦身。
基础
如果没有记错的话,Spring是从1.2起,开始支持自动装载的,这并不是鸡肋功能,在Spring 2.0中得到了进一步的改进。到目前为止,Spring共支持以下五种方式的自动装载:
模式 | 说明 |
---|---|
no |
不使用自动装配。必须通过 |
byName |
根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为 |
byType |
如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置 |
constructor |
与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。 |
autodetect |
通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。 |
步骤
1,将application.xml分成两个,一个文件里面管理的是系统基本信息的Bean管理,另一个文件是业务信息的Bean管理(当然,如果你觉得还不够的话,可以将其按功能模块进一步拆分)。
拆分后当然需要更改web.xml中的配置,如下
2,使用byType的方式,对业务信息部分的Bean进行自动装载,因为我Class中的有些属性可能并不与XML配置中的名称一致,所以想使用这样的方式相对简单,不需要去将属性名和XML的Bean ID一一对应。配置如下:
来,启动应用,试试看效果吧。正在我庆幸自己不用去比对名称的时候,系统到如下阶段时停住了。
此时我等了5分钟,CPU一直被w进程占用,使用率高达98%,目前还不知道为什么会这样,也请各位不吝赐教。
3,既然byType行不通,那就只能byName了,配置如下:
然后核对了一遍名称。为了保险,我还是将每个功能都做了一下冒烟,幸好不多,只有二十个功能左右,果然有两个“冒烟”的,检查一下,发现是类里面的属性名的大小写不对,改正后,一切OK.
成果
1,项目业务模块部分的Bean配置文件一下从原来的800多行变为400多行,瘦身近50%. 2,系统启动时,缩短了XML校验的时间,虽然时间每次缩小的很短,这对于调试来说,还是很值的,因为项目开发中所有调试的运行会有很多次,总量加起也不是个小数目。
3,以后增加功能模块时,就算是Copy以前的配置来改,也可以少改几个地方。
这笔买卖似乎还很值哟,^-^
总结
1,建议不要将所有Bean都设成自动装载,而只用将业务相关的Bean设成自动装载。
2,如果你的项目中名称使用很乱,没有规范,那就不要用byName的自动装载了。
3,如果是重构时使用的自动装载,一定要记得做冒烟。