如果我确实在方法上使用了事务性注释,同时也使用了方面,那么spring将如何处理这一点?它会在事务代理对象上创建方面代理吗?或者spring能够智能地混合两个代理对象的逻辑吗?
如果我的理解完全错误,请纠正我。
发布于 2014-01-10 03:43:09
AOP代理是由BeanPostProcessor创建的,AbstractAutoProxyCreator hirearchy中最具体的代理具有以下步骤
有关查找可应用于bean的建议,请参见AopUtils.findAdvisorsThatCanApply().
OrderComparator,请参见AbstractAdvisorAutoProxyCreator.sortAdvisors().
OrderComparator with advisors。因此,通常只涉及一个代理。
然而,正如马丁所说,如果您通过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 someMethodhttps://stackoverflow.com/questions/21014895
复制相似问题