Spring的beans标签下可以有其他标签

  以前有对xsd(也就是schema文件)小做研究,有个小困惑,就是我们定义的元素只能使用定义的哪一些标签,比如<beans>下面就只能有自定义的哪一些,那为什么在引入<context>、<aop>等命名空间之后就能使用上诉2个标签呢?之前一直嫌弃spring的xsd太长,第一眼看上去比较混乱,今天鼓起勇气看了一下<beans>的xsd文件,看了之后发现其实还是非常简单的,所使用的无外乎也就是xsd那些东西。

  那么,<beans>标签下对元素的定义中有一段是这样子的:

<xsd:sequence>
  <xsd:element ref="description" minOccurs="0" /> 
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
  <xsd:element ref="import" /> 
  <xsd:element ref="alias" /> 
  <xsd:element ref="bean" /> 
  <xsd:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded" /> 
  </xsd:choice>
  </xsd:sequence>

  倒数第三行:表示<beans>下面可以包含任意标签,来自其他命名空间的。这就解释了上面的问题。

  另外:xmlns:p="http://www.springframework.org/schema/p"这个命名空间能够让<bean>的属性<property>标签使用简写,如:

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="basePackage" value="com.mook.mybatis.core.mapper" />
    </bean>

  就可以写成:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" p:basePackage="com.mook.mybatis.core.mapper"/>

  这种方式,但是一般来说没什么必要,少不了几行,另外简写方式不够灵活。一般来说,知道有这么回事就够了,使用前面的方式就行。

  再者:spring的命名空间对xsd的引用不需要加版本号,不加版本号使用的xsd文件就是最新的,他是从classpath中获取的。spring读取校验xsd是先从本地classpath读取,失败才从网络上读取。

原文地址:https://www.cnblogs.com/dreamroute/p/5453590.html