当同时使用方面和事务时,它是代理而不是代理



如果我确实在方法上使用事务注释,同时也使用方面,那么 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

最新更新