Spring XML配置十二个最佳实践

在这篇文章里,对于Spring XML的配置,我将向你展示12种比较好的实践。其中的一些实践不仅是好的实践,更是必要的实践。除此以外,还有其他因素,例如领域模型的设计,都能影响XML的配置,但是这篇文章重点研究XML配置的易读性和易管理性。

  1。不要使用autowiring

  Spring 可以通过类的自省来自动绑定其依赖部分,使得你不必明确指明bean的属性和构造器。Bean的属性可以通过属性名称或类型匹配来实现自动绑定。构造器通过类型匹配来实现自动绑定。你甚至可以指定自动检测自动绑定模式,它可以引导Spring选择一种适当的运行机制。先来看看下面的一个例子:

  

以下是引用片段:
< bean id="orderService" class="com.lizjason.spring.OrderService" autowire="byName"/>
  OrderService 类的属性名在容器中用于匹配bean实例。自动绑定可以潜在地节省一些打字和减少一些混乱。但是在现实世界的工程里你不应该使用这种方式,这是因为它牺牲了配置的清晰性和可维护性。许多指南和介绍中大量吹捧自动绑定是Spring的一种极好的特征而没有提到这一特性所带来的牺牲。依我的观点,这就像 Spring中的object-pooling,它更像是一种为了占据更多市场的商业特征。它对于XML配置文件的小巧化是一个好办法,但实际上也增加了复杂程度,尤其当你运行有大量类声明的工程时。虽然Spring允许你混合自动绑定和手动绑定,但是这个矛盾会使XML配置更加晦涩难懂。
  2.使用通俗的命名

  这个方式对于Java编码也一样适用。在工程中使用清晰的、描述性的、协调的通俗名称对于开发者理解XML配置是十分有益的。例如对于bean ID,你可以根据通俗的Java类名来命名它。对于例子中OrderServiceDAO的bean ID命名为orderServiceDAO。对于大的工程,你可以在bean ID前面加上包名作为前缀。

  3. 使用简洁的形式

  简洁形式避免了冗长,是因为它从子元素中将属性值和参考写到属性中。例如下面的例子:

  

以下是引用片段:
< bean id="orderService" 
  class="com.lizjason.spring.OrderService"> 
  < property name="companyName"> 
  < value>lizjason< /value> 
  < /property> 
  < constructor-arg> 
  < ref bean="orderDAO"> 
  < /constructor-arg> 
  < /bean> 
  可以使用简洁形式将上述代码重写为: 
  < bean id="orderService" 
  class="com.lizjason.spring.OrderService"> 
  < property name="companyName" 
  value="lizjason"/> 
  < constructor-arg ref="orderDAO"/> 
  < /bean>
  简洁形式功能在1.2版本中可以使用。对于< ref local="...">没有简洁形式。
  简洁形式不但可以节约你的打字,而且可以使XML配置文件清晰。它最引人注目的是当在一个配置文件中有大量定义的类时可以提高易读性。

  4. 对于构造器参数匹配,类型名比序号好。

  当一个构造器含有一个以上的同种类型的参数,或者属性值的标签已经被占用时,Spring允许你使用从0计数的序号来解决这些会带来混淆的问题。例如:

  

以下是引用片段:
< bean id="billingService" 
  class="com.lizjason.spring.BillingService"> 
  < constructor-arg index="0" value="lizjason"/> 
  < constructor-arg index="1" value="100"/> 
  < /bean>
  像下面这样,利用类型属性来编写会更好一些:

  

以下是引用片段:
< bean id="billingService" 
  class="com.lizjason.spring.BillingService"> 
  < constructor-arg type="java.lang.String" 
  value="lizjason"/> 
  < constructor-arg type="int" value="100"/> 
  < /bean>
 

  使用索引可以稍稍减少一些冗长,但是和使用类型属性相比,它还是有容易发生错误的倾向和难于阅读的缺点。你应该只在构造器参数不明确的时候,才使用索引这一方法。

  5. 尽可能重用已定义过的bean

  Spring 提供一种类似继承一样的机制来减少配置信息的复制并简化XML配置。定义一个子类可以从它父类那里继承配置信息,而父类实质上作为子类的一个模板。这就是大工程中所谓的重用。你所需要做的就是在父类bean中设置abstract=true,然后在子bean注明它自己的父类bean。例如:

  

以下是引用片段:
< bean id="abstractService" abstract="true" 
  class="com.lizjason.spring.AbstractService"> 
  < property name="companyName" 
  value="lizjason"/> 
  < /bean> 
  < bean id="shippingService" 
  parent="abstractService" 
  class="com.lizjason.spring.ShippingService"> 
  < property name="shippedBy" value="lizjason"/> 
  < /bean> 
  ShippingService类从abstractService类那里继承companyName属性的值??lizjason。如果你没有为一个bean指明类或factory方法,那么这个bean便是抽象的。 
  6. 尽量使用ApplicationContext来装配定义的bean 
  像在Ant脚本中的引用一样,Spring的引用对于装配模块化的bean来说是很有用的。例如: 
  < beans> 
  < import resource="billingServices.xml"/> 
  < import resource="shippingServices.xml"/> 
  < bean id="orderService" 
  class="com.lizjason.spring.OrderService"/> 
  < beans>




相对于使用import在XML配置中来预装配,通过ApplicationContext来配置这些beans,显得更加灵活。利用 ApplicationContext也使得XML配置易于管理。你可以像下面的例子那样在ApplictionContext构造器里布置bean:

  

以下是引用片段:
String[] serviceResources = 
  {"orderServices.xml", 
  "billingServices.xml", 
  "shippingServices.xml"}; 
  ApplicationContext orderServiceContext = new 
  ClassPathXmlApplicationContext(serviceResources);
  7. 利用id作为bean的标识符
  你可以指定一个id或名称来作为bean的标识符。虽然使用id不会提高易读性,但是它可以让XML parser对bean的引用有效方面进行更好的验证。如果由于XML IDREF的限制而不能使用某个id,你可以利用names来作为bean的标识符。XML IDREF的限制是id必须以字母开头(或者在XML规范中定义的标点符号),后面接着字母,数字,连字号,下划线,冒号等。实际上,遇到XML IDREF限制的问题是很少见的。

  8. 在开发阶段使用依赖检验

  你可以在bean中给依赖检验的属性设置值,而不采用原先默认的空值,属性设置例如simple,object或all,以便容器进行依赖检验。当bean的全部的属性(或某类属性)需要被明确设置或自动绑定时,依赖检验便显得很有用。

  

以下是引用片段:
< bean id="orderService" 
  class="com.lizjason.spring.OrderService" 
  dependency-check="objects"> 
  < property name="companyName" 
  value="lizjason"/> 
  < constructor-arg ref="orderDAO"/> 
  < /bean>
  在这个例子里,容器确保为orderService bean设置的属性不是primitives 或者 collections。为所有的bean设置默认依赖检测也是可以的,但是我们很少这样做,是因为有些bean的属性根本就不必设置。
  9. 为每个配置文件加上一个header comment

  最好使用descriptive id和名称来代替在XML配置文件中的注释。此外,加上一个配置文件header也很有用处,它可以概述文件中所定义的bean。你可以选择将描述内容加入description标签中。例如:

  

以下是引用片段:
< beans> 
  < description> 
  This file defines billing service 
  related beans and it depends on 
  baseServices.xml,which provides 
  service bean templates... 
  < /description> 
  ... 
  < /beans>
  使用description标签的一个好处是可以容易地利用工具从标签中选取出description(的内容)。
  10. 对于任何变化,要与队友积极交流

  当你重构Java代码时,你需要随时更新配置文件并且通知队友。XML配置文件也是代码,它们是应用程序的至关重要的部分,但是它们难于阅读和维护。大部分时间你既要阅读XML配置文件又要阅读运行中的Java代码。

  11. Setter injection优于constructor injection

  Spring提供3种类型的依赖注入: constructor injection,setter injection, 和method injection。我们一般只用前两种类型。

  

以下是引用片段:
< bean id="orderService" 
  class="com.lizjason.spring.OrderService"> 
  < constructor-arg ref="orderDAO"/> 
  < /bean> 
  < bean id="billingService" 
  class="com.lizjason.spring.BillingService"> 
  < property name="billingDAO" 
  ref="billingDAO"> 
  < /bean>
  这个例子中,orderService类使用的是constructor injection,而BillingService类使用的是setter injection。constructor injection可以确保bean不会在一个非法状态下被创建,但是setter injection更加灵活并且更易管理,尤其当类存在很多属性并且其中一些是可选的情况下。
  12. 不要滥用依赖注入

  作为最后一点,Spring ApplicationContext可以替你创建Java对象,但是并不是所有的Java对象都通过依赖注入来创建的。例如,全局的对象不应该通过 ApplicationContext来创建。Spring是一个很棒的框架,但是,就易读性和易管理性而言,当定义大量bean的时候,基于XML的配置问题就会突出。过度的依赖注入会使XML配置变得复杂而且臃肿。记住!使用强大的IDE时,例如Eclipse和IntelliJ,与XML文件相比, Java代码更加易读,易维护,易管理。

  总结

  对于Spring的配置,XML是很优秀的方式。但当定义大量 bean时,基于XML配置会变得冗长,笨拙。Spring提供了丰富的配置选项。适当地利用其中的选项可以使XML配置清晰,但是,有些选项,例如 autowiring(自动绑定),往往会降低易读性和易维护性。文章中所列举的实例,可以帮助你创建出清晰易读的XML配置文件
 
使用静态库在嵌入式系统中进行开发 静态库是一种包含预编译对象代码的文件,它可以与应用程序链接在一起,并在编译时将库的代码复制到最终的可执行文件中。静态库是包含预编译对象代码的文件,可以与应用程序链接在一起,并在编译时将库的代码复制到最终的可执行文件中。需要注意的是,由于嵌入式系统的资源限制,开发人员应该仔细选择需要包含在静态库中的功能,并避免引入不必要的依赖关系。需要注意的是,由于嵌入式系统的资源限制,开发人员应该仔细选择需要包含在静态库中的功能,并避免引入不必要的依赖关系。的静态库文件,可以在嵌入式系统的应用程序中使用它了。 阅读详情

相关推荐

别再乱删文件了!修复Print Spooler服务自动停止的3个关键检查点(附Win10/Win11实测)

本文深入解析Windows系统中Print Spooler服务自动停止的常见原因及修复方法。从第三方驱动冲突、权限与服务依赖关系到打印队列积压,提供3个关键检查点的详细排查步骤,帮助用户彻底解决打印服务异常问题,适用于Win10/Win11系统。

weixin_31569671的博客 676

windows上用anaconda安装marvin包并读取本地cube文件

网上查了一堆说是临时文件产生不了,可能是临时文件读写权限有问题,但是用管理员运行spyder或者anaconda也解决不了,更高级的办法不知道,看了下报错的代码有一行是源代码读取本地数据的函数,也就是第6步那里cube.py文件的180和181行有问题,里面用了个gunzip什么玩意好像要解压文件,明明astropy的fits.open就能直接读取.gz的压缩fits文件,为什么还要多此一举解压一遍还要再Temp里搞个临时文件,然后还没有权限,服了。5.用pip uninstall卸载并更换下面版本的包。

jinlixie的博客 912

NGSIM数据集字段解析:从车辆轨迹到交通行为分析

本文深度解析NGSIM数据集的核心字段及其在交通行为分析中的应用。详细解读了车辆时空定位、状态属性及交互关系等关键字段,并通过高速路“幽灵堵车”和城市路口左转行为两个实战案例,展示了如何利用该数据集进行微观交通行为建模与驾驶特征提取,为交通流研究和自动驾驶算法测试提供数据基础。

weixin_29172963的博客 148

Spring-Xml配置

Spring-Xml配置

m0_71212413的博客 3686

Python逆向实战:突破PDD长连接抓包的技术解析

本文详细解析了如何通过Python逆向技术突破PDD长连接抓包的难点,包括分析PDD的网络机制、绕过SSL证书验证以及完整抓包实战流程。文章重点介绍了使用Frida和VAXposed工具解决长连接和SSL Pinning问题,并提供了Python代码示例和数据分析方案,帮助开发者高效抓取PDD数据。

weixin_28678151的博客 1224

SPARTAN6 + Verilog - FPGA step by step 从0开始学习(1)

SPARTAN6 + Verilog - FPGA step by step 从0开始学习(1)Step 1 软件安装Step 2 硬件获取Step 3 开始从头到脚建一个工程Step 3.1 新建一个工程 从0开始学习FPGA,最好的办法就是先建一个最简单的模块,并且跑起来,然后再慢慢展开。下面这个例子是要按照一定的周期点亮核心板上的一个led。 Step 1 软件安装 这个从0开始学习是用的xilinx的SPARTAN6。SPARTAN6集成开发环境用ISE,不能用Vivado,各自对应的版本不同。安装

xfacexx点点记录 5516

Spring XML配置的一些建议

1.最好别使用autowiring  Spring可以通过类的自省来自动绑定其依赖部分,使得你不必明确指明bean的属性和构造器。Bean的属性可以通过属性名称或类型匹配来实现自动绑定。构造器通过类型匹配来实现自动绑定。你甚至可以指定自动检测自动绑定模式,它可以引导Spring选择一种适当的运行机制。先来看看下面的一个例子:class="com.lizjason.spring.OrderS

801

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 282

Spring的xml文档配置

1 2注解的context名称空间 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context

Dylan6868的博客 4142

车载以太网-组播

车载以太网-组播

天赐好车的博客 254

福建公共资源交易平台 portal-sign与响应Data解密逆向实录

本文分析了福建公共资源交易电子公共服务平台的接口加密机制。通过抓包和代码分析,发现请求头中的portal-sign由MD5算法生成,包含固定秘钥和排序后的参数拼接。响应数据采用AES-256-CBC加密,需使用特定Key和IV解密。文章详细介绍了签名生成规则、参数处理流程及加密常量定位方法,为接口对接提供了技术参考。整个过程展示了如何通过逆向工程还原前端加密逻辑,最终实现脱离浏览器环境的纯协议调用。

自成背后的博客 1158

【JAVA】配置 Spring(XML, 注解, Java 配置)

配置 Spring(XML, 注解, Java 配置)

weixin_37559642的博客 1498

YOLO系列算法改进 | Head改进篇 | 融合Detect_LSCD轻量共享卷积检测头 | 轻量化设计破解计算瓶颈,增强复杂场景目标感知能力

YOLO系列算法改进 | Head改进篇 | 融合Detect_LSCD轻量共享卷积检测头 | 轻量化设计破解计算瓶颈,增强复杂场景目标感知能力 (以YOLO26最新目标检测模型为基础,融合Detect_LSCD检测头进行改进)

2502_91881744的博客 704

Spring XML配置的十二个最佳实践

 Spring是一个强大的Java应用框架,它广泛地应用于Java应用程序中,为Plain Old Java Objects(POJO)提供企业级服务。Spring利用依赖注入机制来简化工作,同时提高可测试性。其配置文件(通常是XML格式)中指定了Spring bean、依赖性以及bean所需的服务。但是,这些XML配置文件既冗长又不实用。对于需要定义大量Spring bean的大型项目来

我的世界我的梦 2671

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

spring XML配置十二个最佳实践

摘要:在这篇文章里,对于Spring XML的配置,我将向你展示12种比较好的实践。其中的一些实践不仅是好的实践,更是必要的实践。除此以外,还有其他因素,例如领域模型的设计,都能影响XML的配置,但是这篇文章重点研究XML配置的易读性和易管理性。Spring是一个强大的JAVA应用框架,广泛地应用于JAVA的应用程序。为Plain Old Java Objects(POJOs)提供企业级服务。Sp

花非花 1189

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: div固定页面右下角实现
下一篇: java 获取某周前的礼拜一
sfSam
博客等级 码龄16年 13粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值