我们可以计算Spring bean的初始化时间

时间:2016-08-01 14:22:39

标签: java spring spring-aop

我想开发一个弹簧AOP功能,我们可以在spring bean初始化期间放置一个切入点/内部,以便根据业务需要计算一些统计数据。 我想知道它是否可以使用弹簧AOP模块?

1 个答案:

答案 0 :(得分:4)

您可以使用此组件测量初始化时间:

@Component
public class MyBeanPostProcessor implements BeanPostProcessor, Ordered {

    private Map<String, Long> start;

    private Map<String, Long> end;

    public MyBeanPostProcessor() {
        start = new HashMap<>();
        end = new HashMap<>();
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        start.put(beanName, System.currentTimeMillis());
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        end.put(beanName, System.currentTimeMillis());
        return bean;
    }

    @Override
    public int getOrder() {
        return Integer.MAX_VALUE;
    }

    //this method returns initialization time of the bean.
    public long initializationTime(String beanName) {
       return end.get(beanName) - start.get(beanName);
    }
}

但这次没有包含运行构造函数的时间。

但是在运行所有bean构造函数之前,您可以在读取bean定义之后记录一下。使用BeanFactoryPostProccessor:

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    private long launchTime;

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        launchTime = System.currentTimeMillis();
    }

    public long getLaunchTime() {
        return launchTime;
    }
}

lauchTime是春天刚刚读完配置(例如,xml文件)并准备创建bean的时刻。

因此,可以使用以下两个组件计算完整的初始化时间,例如:max(end) - launchTime。 (初始化最后一个bean的时间与读取bean配置之间的差异)