Blog
Blog copied to clipboard
浅谈BeanNameAutoProxyCreator
有一个这样的场景,项目中有一个module专门处理同一类事情,比如调用外部的RPC、DB操作等,这个module里面的类命名都遵守统一的规范,比如xxx或者xxx。我们需要在每次RPC前后打印出RPC的耗时以及输入和外部返回的结果,如果在每个类里面都做这个事情显得特别冗余,都知道可以使用AOP,那么针对这种情况,哪种方式更好了, BeanNameAutoProxyCreator,之前没有使用过,所以这里做个梳理。
使用方式
针对这种bean name符合一定特征的bean做拦截的话,就是需要配置特定的BeanNameAutoProxyCreator bean,指定bean name的模式和拦截器的名称。
<bean id="fooLogInterceptor" class="com.vonzhou.interceptor.FooLogInterceptor"/>
<bean id="fooLogProxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*RPC</value>
</list>
</property>
<property name="interceptorNames">
<value>fooLogInterceptor</value>
</property>
</bean>
拦截器的实现:
public class FooLogInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Method method = invocation.getMethod();
Object result = null;
try {
result = invocation.proceed();
return result;
} catch (Exception e) {
throw e;
} finally {
try {
// do log
} catch (Exception e) {
// todo
}
}
}
}
原理分析
本质上,BeanNameAutoProxyCreator也是一个BeanPostProcessor,在Spring bean初始化后进行了代理拦截。
