Java 如何使用ExposebeanaMeadvisors`

Java 如何使用ExposebeanaMeadvisors`,java,spring,spring-aop,Java,Spring,Spring Aop,我需要找到我所代理的bean的名称。以下是一些背景: 我有以下xml配置,它使用BeanNameAutoProxyCreator,根据不同的bean的名称代理它们(使用NameMatchMethodPointcutAdvisor): 我知道有一个ExposeBeanNameAdvisors类提供了一个方便的getBeanName(MethodInvocation mi)方法。然而,我不明白什么是“假设一个ExposeBeanNameAdvisor已经包含在拦截器链中。”(来自javadoc)你们

我需要找到我所代理的bean的名称。以下是一些背景:

我有以下xml配置,它使用BeanNameAutoProxyCreator,根据不同的bean的名称代理它们(使用NameMatchMethodPointcutAdvisor):

我知道有一个ExposeBeanNameAdvisors类提供了一个方便的
getBeanName(MethodInvocation mi)
方法。然而,我不明白什么是“假设一个ExposeBeanNameAdvisor已经包含在拦截器链中。”(来自javadoc)你们能给我一个如何使用ExposeBeanNameAdvisor的例子吗


谢谢

ExposebeanMeadvisors有两个
static
方法
createAdvisorWithoutIntroduction
createAdvisorPrintRoducingNamedBean
返回一个
Advisor
对象,该对象应添加到Advisor堆栈中

如果你看看其中一个的实现

private static class ExposeBeanNameInterceptor implements MethodInterceptor {

    private final String beanName;

    public ExposeBeanNameInterceptor(String beanName) {
        this.beanName = beanName;
    }

    public Object invoke(MethodInvocation mi) throws Throwable {
        if (!(mi instanceof ProxyMethodInvocation)) {
            throw new IllegalStateException("MethodInvocation is not a Spring ProxyMethodInvocation: " + mi);
        }
        ProxyMethodInvocation pmi = (ProxyMethodInvocation) mi;
        pmi.setUserAttribute(BEAN_NAME_ATTRIBUTE, this.beanName);
        return mi.proceed();
    }
}
您注意到bean名称作为属性添加到
MethodInvocation
,该属性被转换为
ProxyMethodInvocation
。这需要在定制advisor之前的代理调用堆栈中,以便您可以使用ExposeBeanNameAdvisors.getBeanName()检索bean名称,否则会出现异常

public class MyAdvisor implements MethodInterceptor {
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
      // I want to be able to get the bean name of this method invocation here

      try {
          long startTime = System.nanoTime();
          log(startTime);

          return methodInvocation.proceed();
      }
      finally {
          long endTime = System.nanoTime();
          log(endTime);
      }
    }

}
private static class ExposeBeanNameInterceptor implements MethodInterceptor {

    private final String beanName;

    public ExposeBeanNameInterceptor(String beanName) {
        this.beanName = beanName;
    }

    public Object invoke(MethodInvocation mi) throws Throwable {
        if (!(mi instanceof ProxyMethodInvocation)) {
            throw new IllegalStateException("MethodInvocation is not a Spring ProxyMethodInvocation: " + mi);
        }
        ProxyMethodInvocation pmi = (ProxyMethodInvocation) mi;
        pmi.setUserAttribute(BEAN_NAME_ATTRIBUTE, this.beanName);
        return mi.proceed();
    }
}