Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于注释和基于xml的事务定义优先级_Java_Spring - Fatal编程技术网

Java 基于注释和基于xml的事务定义优先级

Java 基于注释和基于xml的事务定义优先级,java,spring,Java,Spring,我在文档中找不到一个明确的答案,虽然似乎有一个合乎逻辑的答案,但人们不能确定。场景是这样的-您有一个基于xml的事务定义,如: <tx:advice id="txAdvice" transaction-manager="jpaTransactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes&g

我在文档中找不到一个明确的答案,虽然似乎有一个合乎逻辑的答案,但人们不能确定。场景是这样的-您有一个基于xml的事务定义,如:

<tx:advice id="txAdvice" transaction-manager="jpaTransactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

它建议所有的服务方法。但是在一个具体的类/方法上有
@Transactional
,您希望覆盖
传播
属性

很明显,方法级别的
@Transactional
覆盖了类级别的相同代码,但它是否覆盖了
(实际上是


我希望不要在同一个类上创建两个拦截器(无论哪个先发生,都会启动事务)

经过一番挖掘,我认为答案在于
txadviceeandefinitionparser.doParse
。逻辑是这样的:

if <tx:attributes> is present then
   parse <tx:attributes> 
else
   instantiate an AnnotationTransactionAttributeSource to determine TX attributes
如果存在,则
作语法分析
其他的
实例化AnnotationTransactionAttributeSource以确定TX属性
鉴于阅读
@Transactional
的唯一内容是
注释transactionattributesource
,这强烈建议我,
将在且仅在未指定
的情况下查阅
@Transactional
,因此不可能重写

这似乎与Spring通常的“最小意外原则”方法相矛盾,因为我和您一样,也希望注释在每个类或每个方法的基础上优先。我会向他们的JIRA提出问题,以改变这种行为


说了这么多,我仍然认为有必要尝试一下它的功能,因为它可能通过其他机制工作。

感谢斯卡夫曼的努力。最后我想我有了这样的行为:

  • @Transactional
    (与
    一起)围绕目标类(其方法将在事务中运行的类)创建一个
    TransactionInterceptor
  • 具有较低
    顺序
    属性的通知将覆盖另一个通知。如果未指定订单属性,则订单未定义。但是我的测试表明,
    applicationContext.xml
    中定义的最新版本优先,尽管情况并非总是这样:
  • 当在不同方面定义的两条通知都需要在同一连接点上运行时,除非您另外指定,否则执行顺序未定义


    至少这是Spring2.5.6的行为。

    有趣的是,它的行为与我们预期的一样。我现在还要做一些挖掘,看看TXADVICEANDefinitionParser还有什么。我想知道由
    TXADVICEANDefinitionParser
    生成的代理是否在调用时检查目标bean的注释。我猜创建的两个TransactionInterceptor是真的。我在春季论坛上提出了这个问题(包括我的新发现),并将向您提供最新结果。您的上下文中是否也有
    ?这将触发额外的代理创建。是的,有。否则,@Transactional将根本不被考虑。