Spring利用依赖注入可以获得简单而有效的测试能力Spring beans依赖关系以及服务所需要的bean都将在配置文件中予以描述配置文件一般采用XML格式然而XML配置文件冗长而不易使用在你进行一个使用了大量bean的大项目中它将变得难以阅读和控制
在这篇文章中我将给你展示种的有关Spring XML配置文件的最佳技巧请注意另外一些因素例如域模型的设计会影响到XML配置但是这篇文章更关注于XML配置的可读性和可操控性
避免使用自动装配
Spring可以通过bean类的自省来实现自动装配依赖这样的话你就不必明确地描述bean的属性或者构造函数的参数根据属性名称活匹配类型bean属性可以自动进行装配而构造函数可以根据匹配类型自动装配你甚至可以设置自动装配进行自动侦测这样Spring替你就会选择一个合适的机制请看下面的例子
Spring可以通过bean类的自省来实现自动装配依赖这样的话你就不必明确地描述bean的属性或者构造函数的参数根据属性名称活匹配类型bean属性可以自动进行装配而构造函数可以根据匹配类型自动装配你甚至可以设置自动装配进行自动侦测这样Spring替你就会选择一个合适的机制请看下面的例子
class=
com
lizjason
spring
OrderService
autowire=
byName
/>
OrderService类的属性名被用来和容器中的一个bean实例进行匹配自动装配会默默的保存一些类型信息并降低混乱然而由于它会牺牲掉这种配置的直观性和可维护性你在实际的项目中将不会用到它许多指南和陈述材料都把它吹捧为Spring的一个非常cool的特性而没有提到它的这个缺点依我之见就像Spring的对象池一样它更多了一些商业味道它看起来好像可以使XML配置文件更精简一些但实际上却增加其复杂性尤其是在你的较大规模的工程中已经定义了很多bean的时候更是如此Spring允许你混合使用自动和手动装配但是这种矛盾会使XML配置更加的令人费解
使用命名规范
和Java编码的理念一样在项目中始终用清晰的描述性的一致的命名规范对开发人员理解XML配置非常有用拿bean ID举例来说你可以遵循Java类中属性的命名规范比如说OrderServiceDAO的bean ID应该是orderServiceDAO对于大项目来说在bean ID前加包名来作为前缀
使用简化格式
简化格式有利于减少冗余因为它把属性值和引用作为属性而不是子元素看下面的例子
class=
com
lizjason
spring
OrderService
>lizjason
以上程序可以重新以简化格式书写为
class=
com
lizjason
spring
OrderService
>value=
lizjason
/>
简化格式在版本时已经可用了但请注意不存在这种简化格式不仅可以较少你的代码输入量而且可以使XML配置更加的清晰当你的配置文件中存在大量的bean定义时它可以显着地提高可读性
尽量使用type而不是index去解决构造函数参数的匹配问题
当构造函数中有多个同类型的参数时Spring只允许你使用从开始的index或者value标签来解决这个问题请看下面的例子
class=
com
lizjason
spring
BillingService
>
最好用type属性取代上面的做法
class=
com
lizjason
spring
BillingService
>value=
lizjason
/>
用index可以稍微减少冗余但是它更容易出错且不如type属性可读性高你应该仅在构造函数中有参数沖突时使用index
如可能尽量复用bean定义
Spring提供了一种类似于继承的机制来降低配置信息的重复并使XML配置更加的简单一个子bean可以从它的父bean继承配置信息本质上这个父bean就像它的子bean的一个模板这是一个在大型项目中必须使用的特性所有你要做的就是把父bean的abstract属性置为true并在子bean中加以引用例如
class=
com
lizjason
spring
AbstractService
>value=
lizjason
/>parent=
abstractService
class=
com
lizjason
spring
ShippingService
>
shippingService bean继承了abstractService bean的属性companyName的值lizjason注意如果你为bean声名一个class或工厂方法这个bean将会默认为abstract
[] []