2

メソッドでトランザクションアノテーションを使用し、同時にアスペクトも使用する場合、これに対してスプリングはどのように動作しますか? トランザクション プロキシ オブジェクト上にアスペクト プロキシを作成しますか? それとも、スプリングは両方のプロキシ オブジェクトのロジックを混同するほど賢いのでしょうか?

ここで私の理解が完全に間違っている場合は、修正してください。

4

1 に答える 1

2

AOP プロキシは、次の手順で階層構造BeanPostProcessorの中で最も具体的なによって作成されます。AbstractAutoProxyCreator

  • Bean に適用できるアドバイスを見つけます。 を参照してくださいAopUtils.findAdvisorsThatCanApply()
  • アドバイザを でソートします。OrderComparatorを参照してくださいAbstractAdvisorAutoProxyCreator.sortAdvisors()
  • アドバイザでプロキシを作成します。

そのため、通常はプロキシのみが関与します。

ただし、AutorProxyCreator にはわからない他の方法でプロキシを作成すると、Marten が言ったように、プロキシのプロキシを簡単に取得できます。

例えば:

<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
于 2014-01-09T19:43:08.660 に答える