Mark: AspectJ of Spring3
another type xml:
<bean name="dataSourceInterceptor" class="nng.aop.interceptor.DataSourceInterceptor" />
<bean name="proxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Repository</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>dataSourceInterceptor</value>
</list>
</property>
</bean>
<!--<context:component-scan base-package="nng.data.source.*">
<context:include-filter type="annotation" expression="nng.data.jdbc.data.source.ResourceRegistrar" />
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />
</context:component-scan>
-->
Intercepter Class:
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.framework.Advised;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.annotation.Autowired;
public class DataSourceInterceptor implements MethodInterceptor {
@Override
public Object invoke(final MethodInvocation methodInvocation) throws Throwable {
setDatasourceInfo(methodInvocation);
return methodInvocation.proceed();
}
private void setDatasourceInfo(final MethodInvocation methodInvocation) throws Exception {
NngRepository<?,?> nngRepository = null;
try {
nngRepository = getTargetObject(methodInvocation.getThis(), NngRepository.class);
} catch (ClassCastException ex) {
//ignore if not jdbc related
return;
}
if (nngRepository instanceof NngResourceRepository) {
Object[] args = methodInvocation.getArguments();
...
}
}
protected <T> T getTargetObject(final Object proxy, final Class<T> targetClass) throws Exception {
if (AopUtils.isJdkDynamicProxy(proxy)) {
return (T) ((Advised) proxy).getTargetSource().getTarget();
} else {
// expected to be cglib proxy then, which is simply a specialized class
return (T) proxy;
}
}
}