gpt4 book ai didi

java - 当同时使用 Aspect 和 Transactional 时,它是否代理代理?

转载 作者:行者123 更新时间:2023-11-30 09:13:30 26 4
gpt4 key购买 nike

如果我确实在一个方法上使用了事务注解,同时也使用了 Aspect 那么 spring 将如何处理呢?它会在事务代理对象上创建方面代理吗?还是 spring 很聪明,可以混合代理对象的逻辑?

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

最佳答案

AOP 代理由 BeanPostProcessor 创建,AbstractAutoProxyCreator 层次结构中最具体的代理具有以下步骤

  • 查找可应用于 bean 的通知,请参阅 AopUtils.findAdvisorsThatCanApply()
  • 使用 OrderComparator 对顾问进行排序,请参阅 AbstractAdvisorAutoProxyCreator.sortAdvisors()
  • 与顾问一起创建代理。

所以通常只涉及代理。

但是正如 Marten 所说,如果您通过 AutorProxyCreator 未知的其他方式创建代理,您可以轻松获得代理的代理。

例如:

<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>

public class SomeBean {

public void someMethod() {
System.out.println("In someMethod");
}

public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/context.xml");
SomeBean bean = (SomeBean) ctx.getBean("proxy");
bean.someMethod();

}
}

public class Tracer implements MethodBeforeAdvice {

@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("About to execute [" + method.getName() + "]" +
" on target [" + target.getClass().getName() + "]");

}

}

将输出:

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

关于java - 当同时使用 Aspect 和 Transactional 时,它是否代理代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21014895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com