Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 当同时使用方面和事务时,它是代理之上的代理吗?_Java_Spring_Transactional_Aspect - Fatal编程技术网

Java 当同时使用方面和事务时,它是代理之上的代理吗?

Java 当同时使用方面和事务时,它是代理之上的代理吗?,java,spring,transactional,aspect,Java,Spring,Transactional,Aspect,如果我在一个方法上使用事务性注释,同时也使用方面,那么spring将如何处理这个问题?它会在事务代理对象上创建方面代理吗? 或者spring是否智能地混合了代理对象的逻辑 如果我的理解完全错误,请纠正我。AOP代理是由BeanPostProcessor创建的,这是AbstractAutoProxyCreatorHirearch中最具体的一个,请执行以下步骤 查找可应用于bean的建议,请参阅AopUtils.findadvisorshatcanapply() 使用OrderComparator

如果我在一个方法上使用事务性注释,同时也使用方面,那么spring将如何处理这个问题?它会在事务代理对象上创建方面代理吗? 或者spring是否智能地混合了代理对象的逻辑


如果我的理解完全错误,请纠正我。

AOP代理是由
BeanPostProcessor
创建的,这是
AbstractAutoProxyCreator
Hirearch中最具体的一个,请执行以下步骤

  • 查找可应用于bean的建议,请参阅
    AopUtils.findadvisorshatcanapply()
  • 使用
    OrderComparator
    对顾问进行排序,请参阅
    AbstractAdvisorAutoProxyCreator.sortAdvisors()
  • 与顾问一起创建代理
因此,通常只涉及代理

然而,正如Marten所说,如果您通过AutoProxyCreator未知的其他方式创建代理,您可以轻松获得代理的代理

例如:

<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref="target" />
    <property name="proxyTargetClass" value="true" />
    <property name="interceptorNames" value="tracer" />
</bean> 

<bean id="target" class="test.SomeBean" />

<bean id="tracer" class="test.Tracer" />

<aop:config proxy-target-class="true">
    <aop:advisor id="traceAdvisor" advice-ref="tracer" pointcut="execution (public * *(..))" />
</aop:config>
将输出:

About to execute [someMethod] on target [test.SomeBean$$EnhancerByCGLIB$$428125af]
About to execute [someMethod] on target [test.SomeBean$$EnhancerByCGLIB$$ee348b75]
About to execute [someMethod] on target [test.SomeBean]
In someMethod

这取决于。。。这些方面是如何应用的,交易是如何应用的。你能详细说明一下吗?或者如果你能提供一些例子或任何有用的帖子url,可能会详细说明一下。有很多可能的组合,所以详细说明一点会很困难。但正如前面提到的,这要视情况而定。您是使用加载时/编译时编织还是将方面与运行时代理一起使用。在第一种情况下,永远不可能代理代理;在第二种情况下,只有在配置错误的情况下才可能代理代理(即,添加另一个
AutoproxyCreator
,而不是让spring为您处理事情)。
About to execute [someMethod] on target [test.SomeBean$$EnhancerByCGLIB$$428125af]
About to execute [someMethod] on target [test.SomeBean$$EnhancerByCGLIB$$ee348b75]
About to execute [someMethod] on target [test.SomeBean]
In someMethod