首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当同时使用方面和事务时,它是代理服务器吗?

当同时使用方面和事务时,它是代理服务器吗?
EN

Stack Overflow用户
提问于 2014-01-09 16:16:44
回答 1查看 267关注 0票数 2

如果我确实在方法上使用了事务性注释,同时也使用了方面,那么spring将如何处理这一点?它会在事务代理对象上创建方面代理吗?或者spring能够智能地混合两个代理对象的逻辑吗?

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

EN

回答 1

Stack Overflow用户

发布于 2014-01-10 03:43:09

AOP代理是由BeanPostProcessor创建的,AbstractAutoProxyCreator hirearchy中最具体的代理具有以下步骤

有关查找可应用于bean的建议,请参见AopUtils.findAdvisorsThatCanApply().

  • Sort advisors with an OrderComparator,请参见AbstractAdvisorAutoProxyCreator.sortAdvisors().

  • Create
  • OrderComparator with advisors。

因此,通常只涉及一个代理。

然而,正如马丁所说,如果您通过AutorProxyCreator未知的其他方式创建代理,您可以很容易地获得代理的代理。

例如:

代码语言:javascript
复制
<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>

使用

代码语言:javascript
复制
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() + "]");

    }

}

将输出:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21014895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档