4

我是春豆的新手。我指的是书籍和博客。在某些情况下,上下文配置<beans:bean><beans>. 有什么不同?我们应该在上下文文件中给出 XML 命名空间吗?是否会在应用部署时参考实际站点?

4

2 回答 2

5

就 Spring 而言,这无关紧要 - XML 必须是有效的,这样 Spring 才能理解它,仅此而已。这取决于您选择哪种格式。通常您使用默认命名空间以避免输入过多(所有示例均基于附录 C. 基于 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-3.0.xsd">

    <bean id="..."/>

</beans>

xmlns="..."属性定义默认命名空间(如果您根本不指定任何命名空间,则使用该命名空间,例如<beans/>. 这很好,只要您仅使用单个beans命名空间并且偶尔使用来自其他命名空间的少量声明:

<?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-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

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

</beans>

但有时您会注意到与默认命名空间相比,您使用的来自不同命名空间的节点要多得多beans。一个很好的例子是Spring Security 配置文件:

<beans xmlns:security="http://www.springframework.org/schema/security"
  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-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">

    <security:http auto-config='true'>
        <security:intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <security:intercept-url pattern="/**" access="ROLE_USER" />
        <security:form-login login-page='/login.jsp'/>
        <security:session-management>
            <security:concurrency-control max-sessions="1" />
        </security:session-management>
        <security:openid-login>
            <security:attribute-exchange>
                <security:openid-attribute name="email" type="http://axschema.org/contact/email" required="true" />
                <security:openid-attribute name="name" type="http://axschema.org/namePerson" />
            </security:attribute-exchange>
        </security:openid-login>
    </security:http>

    <security:authentication-manager>
        <security:authentication-provider user-service-ref='myUserDetailsService'/>
    </security:authentication-manager>

    <bean id="myUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>

您会看到它是多么笨拙,因为beans很少使用默认命名空间,但整个文件必须用security:前缀弄乱?这个怎么样(注意xmlns命名空间声明是如何改变的):

<beans:beans xmlns="http://www.springframework.org/schema/security"
  xmlns:beans="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-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">

    <http auto-config='true'>
        <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <intercept-url pattern="/**" access="ROLE_USER" />
        <form-login login-page='/login.jsp'/>
        <session-management>
            <concurrency-control max-sessions="1" />
        </session-management>
        <openid-login>
            <attribute-exchange>
                <openid-attribute name="email" type="http://axschema.org/contact/email" required="true" />
                <openid-attribute name="name" type="http://axschema.org/namePerson" />
            </attribute-exchange>
        </openid-login>
    </http>

    <authentication-manager>
        <authentication-provider user-service-ref='myUserDetailsService'/>
    </authentication-manager>

    <beans:bean id="myUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
        <beans:property name="dataSource" ref="dataSource"/>
    </beans:bean>

</beans:beans>

这两个配置文件在语义上是等价的(只是编码相同信息的不同方式)。但后者更具可读性。只要使用最常用的命名空间,就使用默认命名空间。

于 2012-07-16T19:24:00.673 回答
1

它依赖于 XML 命名空间配置,不是 Spring 特性,对代码没有影响,对 coder 有一些影响,实际上只是xmlns在根 xml 元素上定义属性的效果。在 Spring Security 的这一章中了解更多信息<beans:bean>(实际上与 Spring Framework 不同,但很常见,并且在 XML 文件中使用自己的命名空间)。你可以写:

<beans:beans xmlns="http://www.springframework.org/schema/security"
  xmlns:beans="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-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

  <global-method-security pre-post-annotations="enabled">
    <expression-handler ref="expressionHandler"/>
  </global-method-security>

  <beans:bean id="expressionHandler" class=
        "org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
    <beans:property name="permissionEvaluator" ref="myPermissionEvaluator"/>
  </beans:bean>
</beans:beans>

这相当于:

<beans xmlns="http://www.springframework.org/schema/beans" <!-- see the difference here? -->
       xmlns:security="http://www.springframework.org/schema/security"
       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-3.0.xsd
                           http://www.springframework.org/schema/security
                           http://www.springframework.org/schema/security/spring-security-3.1.xsd">
  <security:global-method-security pre-post-annotations="enabled">
    <security:expression-handler ref="expressionHandler"/>
  </security:global-method-security>

  <bean id="expressionHandler" class=
        "org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
    <property name="permissionEvaluator" ref="myPermissionEvaluator"/>
  </bean>
</beans>

就我个人而言,我总是使用 bean 作为主要命名空间,但这是习惯问题。

于 2012-07-16T19:23:38.480 回答