Chinaunix首页 | 论坛 | 博客
  • 博客访问: 377337
  • 博文数量: 1051
  • 博客积分: 53280
  • 博客等级: 大将
  • 技术积分: 6670
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 13:21
文章分类

全部博文(1051)

文章存档

2011年(1)

2008年(1050)

我的朋友

分类:

2008-09-09 16:34:05

    缘起

    随着系统中不断的增加需求,功能越来越多了。昨天,看到我项目中的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>contextConfigLocationparam-name>
        
<param-value>classpath:applicationContext*.xml,classpath:xfire-servlet.xmlparam-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一直被w进程占用,使用率高达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,如果是重构时使用的自动装载,一定要记得做冒烟。

【责编:Chuan】

--------------------next---------------------

阅读(136) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~