本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 阅读(1879)
评论(2) 编辑 收藏 所属分类:
Java