2
如果我通過方法使用事務註釋並同時使用Aspect,那麼spring將如何表現?它會通過事務代理對象創建方面代理嗎? 或者春天是智能混合兩個代理對象的邏輯?使用Aspect和Transactional時,是否通過代理進行代理?
如果我的理解在這裏完全錯誤,請糾正我。
如果我通過方法使用事務註釋並同時使用Aspect,那麼spring將如何表現?它會通過事務代理對象創建方面代理嗎? 或者春天是智能混合兩個代理對象的邏輯?使用Aspect和Transactional時,是否通過代理進行代理?
如果我的理解在這裏完全錯誤,請糾正我。
AOP代理由BeanPostProcessor
,最特殊的一個下面的步驟
AopUtils.findAdvisorsThatCanApply()
創造AbstractAutoProxyCreator
hirearchy。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
這取決於...交易是如何將這些方面應用和如何應用的。 –
可否請您詳細說明一下,或者可以提供一些示例或任何有用的網址。 –
有很多可能的組合,所以一點點闡述都很難。但正如所提及的那樣。你使用加載/編譯時編織還是使用帶有運行時代理的方面?在第一種情況下,第二種情況下代理可能不會有代理,但通常情況下只有在配置錯誤的情況下(即添加另一個'AutoproxyCreator'而不是讓Spring爲您處理事情)。 –