All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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