1

我使用事务管理和 AOP 如下:

<tx:advice id="tx.sys.advice" transaction-manager="sys.tx.mngr" >
    <tx:attributes>
        <tx:method name="suspendMember" read-only="false" propagation="REQUIRES_NEW" timeout="10"/>
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="domain.pointcut" expression="execution(* com.IUser.*(..))" />
    <aop:advisor advice-ref="tx.sys.advice" pointcut-ref="domain.pointcut" />

    <aop:advisor advice-ref="tx.sys.advice" pointcut-ref="domain.pointcut"  />
</aop:config>

我将超时设置为,10但我想通过属性文件中的属性设置它。我将我的 xml 内容更改如下:

<tx:method name="suspendMember" read-only="false" propagation="REQUIRES_NEW" timeout="${setting.timeout}"/>

通过上述更改,我在运行时出现错误,如下所示:

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 20 in XML document from class path resource [context.xml] is invalid; 
nested exception is org.xml.sax.SAXParseException; 
lineNumber: 20; columnNumber: 116; 
cvc-datatype-valid.1.2.1: '${setting.timeout}' is not a valid value for integer'

编辑

我的context.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/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

春天的版本是:3.0.5.RELEASE


指针类型有一些特性让它们非常有用:

  1. 保证一个指针会很大,以至于它可以保存架构支持的任何地址(在 x86 上,即 32 位,即 4 字节,以及 x64 64 位,即 8 字节)。
  2. 取消引用和索引内存是按对象完成的,而不是按字节完成的。

    int buffer[10];
    char*x = buffer;
    int*y  = (int*)buffer;
    

这样,x[1] 就不是 y[1]

如果您使用 simple ints 来保存您的值,则两者都不能保证。第一个特征至少是由uintptr_t(虽然不是size_t,虽然大多数时候它们具有相同的大小 - 除了size_t在具有分段内存布局的系统上可以是 2 字节大小,而uintptr_t仍然是 4 字节大小)。

虽然使用ints 一开始可能会起作用,但您总是:

  1. 必须将值转换为指针
  2. 必须取消引用指针
  3. 并且必须确保您的“指针”不会超出某些值。对于 16 位 int,您不能超过 0xFFFF,对于 32 位,它是 0xFFFF FFFF - 一旦您这样做,您的指针可能会溢出而您没有注意到它,直到为时已晚。

这也是链接列表和指向不完整类型的指针起作用的原因 - 编译器已经知道您要指向的指针的大小,并且只是为它们分配内存。所有指针都具有相同的大小(在 32 位/64 位架构上为 4 或 8 个字节)——您分配给它们的类型只是告诉编译器如何取消引用该值。char*s 占用与void*s 相同的空间,但不能取消引用void*s。编译器不会让你。

此外,如果您只是在处理简单的整数,那么您很有可能会显着降低程序对“别名”的执行速度,这基本上会强制编译器一直读取给定地址的值。虽然内存访问很慢,但您希望优化这些内存访问。

4

0 回答 0