org.test4j.module.tracer.spring.SpringBeanTracer Maven / Gradle / Ivy
package org.test4j.module.tracer.spring;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.test4j.module.tracer.TracerHelper;
import org.test4j.module.tracer.TracerManager;
@SuppressWarnings("rawtypes")
public class SpringBeanTracer implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
boolean tracerEnabled = TracerHelper.doesTracerEnabled();
if (tracerEnabled) {
return this.tracerProceed(invocation);
} else {
return invocation.proceed();
}
}
private Object tracerProceed(MethodInvocation invocation) throws Throwable {
Class beanClazz = invocation.getThis().getClass();
String method = invocation.getMethod().getName();
Object[] paras = invocation.getArguments();
TracerManager.traceBeanInputs(beanClazz, method, paras);
try {
Object result = invocation.proceed();
TracerManager.traceBeanReturn(beanClazz, method, result);
return result;
} catch (Throwable e) {
TracerManager.traceBeanException(beanClazz, method, e);
throw e;
}
}
/**
* 增加自动跟踪的auto tracer bean definition
*
* @param beanFactory
*/
public static void addTracerBeanDefinition(final BeanDefinitionRegistry beanFactory) {
AbstractBeanDefinition pointcut = new GenericBeanDefinition();
pointcut.setBeanClassName(TracerMethodRegexPointcut.class.getName());
pointcut.setScope("singleton");
pointcut.setAutowireCandidate(false);
pointcut.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_NO);
pointcut.setLazyInit(true);
beanFactory.registerBeanDefinition("test4j-internal-methodname-pointcut", pointcut);
AbstractBeanDefinition advice = new GenericBeanDefinition();
advice.setBeanClassName(SpringBeanTracer.class.getName());
advice.setScope("singleton");
advice.setAutowireCandidate(false);
advice.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_NO);
advice.setLazyInit(true);
beanFactory.registerBeanDefinition("test4j-internal-springbeantracer", advice);
AbstractBeanDefinition advisor = new GenericBeanDefinition();
advisor.setBeanClassName(DefaultPointcutAdvisor.class.getName());
advisor.setScope("singleton");
advisor.setAutowireCandidate(false);
advisor.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_NO);
advisor.getPropertyValues().addPropertyValue("pointcut",
new RuntimeBeanReference("test4j-internal-methodname-pointcut"));
advisor.getPropertyValues().addPropertyValue("advice",
new RuntimeBeanReference("test4j-internal-springbeantracer"));
advisor.setLazyInit(true);
beanFactory.registerBeanDefinition("test4j-internal-beantracer-advisor", advisor);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy