Spring : 基于XML Schema的配置(一)

【本教程翻译自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>

笔者注:如果你想笔者一样最早接触的是Spring 3.0,那么你应该也会对DTD风格的配置文件感到陌生。

需要说明的是,xsi:schemaLocation片段并不是必须的,但它能被包含去引用一个模式的本地副本。(在开发时有用)

本教程的以下部分是介绍新的基于XML Schema标签,每个讲解由至少一个例子,并有之前的版本写法(100%合法并支持,但显然麻烦得多)。

  • util 模式

正如名字暗示的,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>

上面的配置使用了FactoryBean的一个实现FieldRetrievingFactoryBean,并对isolation属性设值(一个常量:java.sql.Connection.TRANSACTION_SERIALIZABLE)。这样写当然没问题,但却像用户暴露了Spring 的内部注入方法。

现在,你可以这样写:

<bean id="..." class="...">
    <property name="isolation">
        <util:constant static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE"/>
    </property>
</bean>

FieldRetrievingFactoryBean是用来获取静态或非静态的字段,通常是用public static final 修饰的常量,(用来设值注入或构造器注入)

下面展示的是如何暴露一个静态字段,(使用staticField)

<bean id="myField"
        class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <property name="staticField" value="java.sql.Connection.TRANSACTION_SERIALIZABLE"/>
</bean>

还有一种便捷的写法,就是将静态字段作为一个bean的名字。

<bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE"
        class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>

这样就表明没必要再去选择bean的id是什么,但这种形式又是非常精确和方便的用做内部bean。

当然,它也可以获取非静态字段。但用的不多,这里不再介绍。

<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"/>

上述配置使用了FactoryBean的一个实现PropertyPathFactoryBean来创建一个名叫testBean.age的bean(类型是int),它的值和testBean的age属性相同。

现在你可以:

<!-- 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"/>

PropertyPathFactory能够计算一个给定目标对象的属性路径。这个目标对象可以直接指出或通过bean的名字。

// 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的名字指出,(注意, targetBeanName和propertyPath)

下面一段的配置是直接通过内部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>

我们还有一种简写的方法,就是用路径做id.

<!-- 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/>

以前你要这样去引用一个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"/>
时间: 2024-10-27 06:39:40

Spring : 基于XML Schema的配置(一)的相关文章

Spring : 基于XML Schema 的配置 (二)

[本教程翻译自Spring 官方文档,并有适当增删] 续上一篇: <util:list/> 以前如果要装配一个集合(List),你要这样写: <!-- creates a java.util.List instance with values loaded from the supplied sourceList --> <bean id="emails" class="org.springframework.beans.factory.conf

Spring 框架的概述以及Spring中基于XML的IOC配置

Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器.框架.一站式 优势: 方便解耦:做到编译期不依赖,运行期才依赖 AOP的支持 声明式事务的支持 方便程序的测试 方便整合各种框架 降低JavaEE API的使用难度 Spring源码很厉害 解耦: 耦合包括:类之间的和方法之间的 解决的思路: 在创建对象的时候用反射来创建,而不是new 读取配置文件

基于XML的AOP配置

创建spring的配置文件并导入约束 此处要导入aop的约束 <?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:aop="http://

Spring基于XML方式的使用

一.IoC配置 IoC的配置是通过Spring的xml文件的bean标签进行的. 1.bean标签介绍 bean标签一般是在xml文件进行配置的,xml文件一般样式如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.or

spring在xml文件中配置bean的三种方法

一.最常见,也是缺省,是调用spring的缺省工厂类 spring缺省工厂类:org.springframework.beans.factory.support.DefaultListableBeanFactory使用其静态方法preInstantiateSingletons() 配置文件中最普通最基本的定义一个普通bean<bean id="DvdTypeDAOBean" class="com.machome.dvd.impl.DvdTypeDAO" >

spring基于xml的声明式事务控制配置步骤

<?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:aop="http://www.springframework.org/schema/

基于Spring可扩展Schema自定义配置(2)

本章主要实现配置支持,注解扫描等功能.为本次教程的核心 命名空间支持 要实现命名空间支持,需要继承自NamespaceHandlerSupport. package com.codestd.spring.cxf.config.schema; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; import com.codestd.spring.cxf.config.EndpointBeanProcessor;

Spring 基于xml配置方式的事务

参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为为每个字段提供一个setXxx()方法 最后就是配置applicationContext.xml文件了.内容如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http:/

Spring 基于xml配置方式的事务(14)

参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为为每个字段提供一个setXxx()方法 最后就是配置applicationContext.xml文件了.内容如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http:/