【本教程翻译自Spring官方文档,并有适当增删】
(是针对Spring 4.0.6 Release版本的)
基于XML Schema的配置在Spring 2.0开始被引入,并在2.5和3.0版本得到增强和扩展。
转向基于XML Schema的动机是使得Spring XML配置更简单。传统的基于 <bean/>的方法是很好,但它的通用特性带来了很大的配置开销。
从Spring 依赖注入容器的观点来看,一切都是bean。这对Spring 容器是个好消息,因为如果一切都是bean,那么一对象都能以相同的方式看待。但在程序员看来并不是这样,因为在Spring XML配置文件的对象并不是通用的bean。常见的情况是,每个bean需要一定程度上的特殊配置。
Spring 2.0新出现的基于XML Schema的配置解决了这一问题。<bean/>元素还是存在的,如果你愿意的话,还可以只使用<bean/>元素。新的基于XML Schema的配置语法使得Spring XML的可读性更好,且允许你更好表达一个bean的意图。
关键是记住:新的自定义标签将最适合基础性或整合类的beans,比如AOP(切面编程)、集合、事务、整合第三方框架等。而已存在的bean 标签最适合特殊用途的beans,如DAOS,服务层对象,验证器对象等。
你得由DTD风格的转变到XML Schema风格。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <!-- bean definitions here --> </beans>
XML Schema风格的如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- bean definitions here --> </beans>
需要说明的是,xsi:schemaLocation片段并不是必须的,但它能被包含去引用一个模式的本地副本。(在开发时有用)
本教程的以下部分是介绍新的基于XML Schema标签,每个讲解由至少一个例子,并有之前的版本写法(100%合法并支持,但显然麻烦得多)。
正如名字暗示的,util标签处理的是一些常见的,实用工具类的配置问题,比如集合、常量等。
当然,你得首先引入命名空间完成正确的模式引用。
<?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- bean definitions here --> </beans>
<util:constant/>
比如说,过去你可能使用下面的配置:
<bean id="..." class="..."> <property name="isolation"> <bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" /> </property> </bean>
现在,你可以这样写:
<bean id="..." class="..."> <property name="isolation"> <util:constant static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE"/> </property> </bean>
下面展示的是如何暴露一个静态字段,(使用staticField)
<bean id="myField" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <property name="staticField" value="java.sql.Connection.TRANSACTION_SERIALIZABLE"/> </bean>
<bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>
当然,它也可以获取非静态字段。但用的不多,这里不再介绍。
<util:property-path/>
<!-- target bean to be referenced by name --> <bean id="testBean" class="org.springframework.beans.TestBean" scope="prototype"> <property name="age" value="10"/> <property name="spouse"> <bean class="org.springframework.beans.TestBean"> <property name="age" value="11"/> </bean> </property> </bean> <!-- will result in 10, which is the value of property age of bean testBean --> <bean id="testBean.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>
现在你可以:
<!-- target bean to be referenced by name --> <bean id="testBean" class="org.springframework.beans.TestBean" scope="prototype"> <property name="age" value="10"/> <property name="spouse"> <bean class="org.springframework.beans.TestBean"> <property name="age" value="11"/> </bean> </property> </bean> <!-- will result in 10, which is the value of property age of bean testBean --> <util:property-path id="name" path="testBean.age"/>
// target bean to be referenced by name <bean id="person" class="org.springframework.beans.TestBean" scope="prototype"> <property name="age" value="10"/> <property name="spouse"> <bean class="org.springframework.beans.TestBean"> <property name="age" value="11"/> </bean> </property> </bean> // will result in 11, which is the value of property spouse.age of bean person <bean id="theAge" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"> <property name="targetBeanName" value="person"/> <property name="propertyPath" value="spouse.age"/> </bean>
下面一段的配置是直接通过内部bean计算属性路径的:
<!-- will result in 12, which is the value of property age of the inner bean --> <bean id="theAge" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"> <property name="targetObject"> <bean class="org.springframework.beans.TestBean"> <property name="age" value="12"/> </bean> </property> <property name="propertyPath" value="age"/> </bean>
<!-- will result in 10, which is the value of property age of bean person --> <bean id="person.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>
<util:properties/>
<!-- creates a java.util.Properties instance with values loaded from the supplied location --> <bean id="jdbcConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="location" value="classpath:com/foo/jdbc-production.properties"/> </bean>
<!-- creates a java.util.Properties instance with values loaded from the supplied location --> <util:properties id="jdbcConfiguration" location="classpath:com/foo/jdbc-production.properties"/>
原文地址:http://blog.csdn.net/chenloveit/article/details/38797695