缘起
随着系统中不断的增加需求功能越来越多了昨天看到我项目中的applicationxml已经超过了行还有Acegi和XFire的配置文件也比较长所以就想着来分拆和瘦身
基础
如果没有记错的话Spring是从起开始支持自动装载的这并不是鸡肋功能在Spring 中得到了进一步的改进到目前为止Spring共支持以下五种方式的自动装载
模式 | 说明 | no
不使用自动装配必须通过ref
元素指定依赖这是默认设置由于显式指定协作者可以使配置更灵活更清晰因此对于较大的部署配置推荐采用该设置而且在某种程度上它也是系统架构的一种文档形式
byName
根据属性名自动装配此选项将检查容器并根据名字查找与属性完全一致的bean并将其与属性自动装配例如在bean定义中将autowire设置为by name而该bean包含master属性(同时提供setMaster()方法)Spring就会查找名为master
的bean定义并用它来装配给master属性
byType
如果容器中存在一个与指定属性类型相同的bean那么将与该属性自动装配如果存在多个该类型的bean那么将会抛出异常并指出不能使用byType方式进行自动装配若没有找到相匹配的bean则什么事都不发生属性也不会被设置如果你不希望这样那么可以通过设置dependencycheck=objects
让Spring抛出异常
constructor
与byType的方式类似不同之处在于它应用于构造器参数如果在容器中没有找到与构造器参数类型一致的bean那么将会抛出异常
autodetect
通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配如果发现默认的构造器那么将使用byType方式
步骤
将applicationxml分成两个一个文件里面管理的是系统基本信息的Bean管理另一个文件是业务信息的Bean管理(当然如果你觉得还不够的话可以将其按功能模块进一步拆分)
拆分后当然需要更改webxml中的配置如下
<contextparam>
<paramname>contextConfigLocation</paramname>
<paramvalue>classpath:applicationContext*xmlclasspath:xfireservletxml</paramvalue>
</contextparam>
使用byType的方式对业务信息部分的Bean进行自动装载因为我Class中的有些属性可能并不与XML配置中的名称一致所以想使用这样的方式相对简单不需要去将属性名和XML的Bean ID一一对应配置如下
<beansdefaultautowire=byType>
</beans>
来启动应用试试看效果吧正在我庆幸自己不用去比对名称的时候系统到如下阶段时停住了
|INFO|::;|orgspringframeworkormhibernateHibernateTransactionManager:orgspringframeworkormhibernateHibernateTransactionManagerafterPropertiesSet()|UsingDataSource[monsdbcpBasicDataSource@daeb]ofHibernateSessionFactoryforHibernateTransactionManager|
此时我等了分钟CPU一直被Javaw进程占用使用率高达%目前还不知道为什么会这样也请各位不吝赐教
既然byType行不通那就只能byName了配置如下
<beansdefaultautowire=byName>
</beans>
然后核对了一遍名称为了保险我还是将每个功能都做了一下冒烟测试幸好不多只有二十个功能左右果然有两个冒烟的检查一下发现是类里面的属性名的大小写不对改正后一切OK
成果
项目业务模块部分的Bean配置文件一下从原来的多行变为多行瘦身近% 系统启动时缩短了XML校验的时间虽然时间每次缩小的很短这对于调试来说还是很值的因为项目开发中所有调试的运行会有很多次总量加起也不是个小数目
以后增加功能模块时就算是Copy以前的配置来改也可以少改几个地方
这笔买卖似乎还很值哟^^
总结
建议不要将所有Bean都设成自动装载而只用将业务相关的Bean设成自动装载
如果你的项目中名称使用很乱没有规范那就不要用byName的自动装载了
如果是重构时使用的自动装载一定要记得做冒烟测试