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